我正在尝试用下划线替换方括号内的短划线,但它会用字符串中的下划线替换所有短划线。
例如,我想替换
"[a]-[a-gamma]"
与
"[a]-[a_gamma]"
但它用带下划线的字符串替换所有破折号。
答案 0 :(得分:2)
您可以使用
String n="[a]-[a-gamma]";
System.out.println(n.replaceAll("-(?=[^\\[\\]]*\\])", "_"));
至于正则表达式本身,我只会匹配-
符号,如果它后跟非[
s和非]
s,直到引擎找到]
}。然后,我们在"内部" []
。可能存在这种情况并非如此([a-z]-[a-z] - ] [a-z]
中的第4个连字符),但我希望不是你的情况。
输出:
[a]-[a_gamma]
答案 1 :(得分:1)
使用否定前瞻:
str = str.replaceAll("-(?![^\\]]*\\[)", "_");
正则表达式匹配破折号,其下一个方括号字符不是一个空方括号。
答案 2 :(得分:1)
答案 3 :(得分:1)
如果您的括号是平衡的(或者如果默认情况下默认打开未关闭的括号直到结束),您可以使用这种方式找到匹配项,只需几个步骤:
图案:
((?:\\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)
失败的原因。
答案 4 :(得分:0)
这个怎么样?
/\[[^\]]*?(-)[^\[]*?\]/g
提取的匹配组:
"[a]-[a-gamma] - [[ - - [123-567567]]]"
^ ^
此处提供的说明:https://regex101.com/r/oC2xE0/1