如何使用正则表达式Java替换方括号内的下划线

我试图用下划线替换方括号内的破折号,但它用字符串中的下划线替换所有破折号。

例如,我想要替换

"[a]-[a-gamma]" 

 "[a]-[a_gamma]" 

但它用下划线替换字符串中的所有破折号。

您可以使用

 String n="[a]-[a-gamma]"; System.out.println(n.replaceAll("-(?=[^\\[\\]]*\\])", "_")); 

至于正则表达式本身,我只匹配-符号,如果它后跟非[ s和非] s,直到引擎找到] 。 然后,我们在[] s里面。 可能存在这种情况并非如此( [az]-[az] - ] [az]第4个连字符,但我希望不是你的情况。

IDEONE演示

输出:

 [a]-[a_gamma] 
 -(?=[^\\[]*\\]) 

你可以使用它。参见演示。

https://regex101.com/r/bN8dL3/6

使用否定前瞻:

 str = str.replaceAll("-(?![^\\]]*\\[)", "_"); 

正则表达式匹配破折号,其下一个方括号字符不是左方括号。

如果您的括号是平衡的(或者如果默认情况下将未关闭的括号打开直到结束),您可以使用这种方式找到匹配项,只需几步即可:

图案:

 ((?:\\G(?!\\A)|[^\\[]*\\[)[^\\]-]*)- 

替换:

 $1_ 

演示

图案细节:

 ( # open the capture group 1 (?: # open a non capturing group for the 2 possible beginings \\G (?!\\A) # this one succeeds immediately after the last match | [^\\[]* \\[ # this one reach the first opening bracket # (so it is the first match) ) [^\\]-]* # all that is not a closing bracket or a dash ) # close the capture group - # the dash 

\G锚标记最后一场比赛后的位置。 但是在开始时(因为还没有匹配),它默认匹配字符串的开头。 这就是我在字符串开头添加(?!\A)失败的原因。

这个怎么样?

 /\[[^\]]*?(-)[^\[]*?\]/g 

匹配组提取:

 "[a]-[a-gamma] - [[ - - [123-567567]]]" ^ ^ 

可在此处获得解释: https : //regex101.com/r/oC2xE0/1