如何使用正则表达式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]
使用否定前瞻:
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