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

时间:2015-05-06 11:20:12

标签: java regex

我正在尝试用下划线替换方括号内的短划线,但它会用字符串中的下划线替换所有短划线。

例如,我想替换

"[a]-[a-gamma]"

"[a]-[a_gamma]"

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

5 个答案:

答案 0 :(得分:2)

您可以使用

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

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

IDEONE Demo

输出:

[a]-[a_gamma]

答案 1 :(得分:1)

使用否定前瞻:

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

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

答案 2 :(得分:1)

Option1
Option2
Option3

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

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

答案 3 :(得分:1)

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

图案:

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

替换:

$1_

demo

模式细节:

(                   # 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

相关问题