繁体   English   中英

正则表达式不包括方括号

[英]Regex excluding square brackets

我是正则表达式的新手。 我有这个正则表达式:

\[(.*[^(\]|\[)].*)\]

基本上它应该采取这个:

[[a][b][[c]]]

并能够替换为:

[dd[d]]

abc,d是无关的。 不用说正则表达式不起作用。 在这种情况下,它用“d”替换整个字符串。

任何解释或帮助都会很棒!

编辑:

我尝试了另一个正则表达式,

\[([^\]]{0})\]

这个适用于括号不包含内括号而内部没有其他内容的情况。 但它不适用于所描述的情况。

你需要知道这一点. dot是特殊字符,表示“新线标旁边的任何字符”, *是贪婪的,所以它会尝试找到最大匹配。

在你的正则表达式\\[(.*[^(\\]|\\[)].*)\\] .*将代表[[^(\\]|\\[)].*)\\]]之间的最大字符集[^(\\]|\\[)].*)\\]]这部分可以理解为非[]字符,可选的其他字符.*最后] 所以这个正则表达式将匹配您的整个输入。


要摆脱这个问题,请从你的正则表达式中删除.* 您也不需要使用| ( )[^...]

System.out.println("[[a][b][[c]]]".replaceAll("\\[[^\\]\\[]\\]", "d"));

输出: [dd[d]]

\\[(\\[a\\])(\\[b\\])\\[(\\[c\\])\\]\\]

如果需要在当前上下文中加倍反斜杠(例如将其放在“”样式字符串中):

\\\\[(\\\\[a\\\\])(\\\\[b\\\\])\\\\[(\\\\[c\\\\])\\\\]\\\\]

abc替换示例是[^\\]]* ,或者如果需要转义反斜杠[^\\\\]]*

现在你可以替换捕获一个,捕获两个并用d捕获三个。


如果您要替换的字符串不完全是那种格式,那么您希望用全局替换

(\\[a\\])

替换a

(\\[[^\\]]*\\])

加倍反斜杠,

(\\\\[[^\\\\]]*\\\\])

试试这个:

System.out.println("[[a][b][[c]]]".replaceAll("\\[[^]\\[]]", "d"));

如果a,b,c在真实世界中有多个字符,请使用:

System.out.println("[[a][b][[c]]]".replaceAll("\\[[^]\\[]++]", "d"));

我们的想法是使用包含所有字符的字符类,但[] 该类是: [^]\\\\[]和模式中的其他方括号是文字。

请注意,字符结束方括号不需要在字符类的第一个位置和字符类之外进行转义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM