我是regex的新手。我有这个正则表达式:
\[(.*[^(\]|\[)].*)\]
基本上应该这样:
[[a][b][[c]]]
能够替换为:
[dd[d]]
abc,d是无关的。不用说正则表达式不起作用。在这种情况下,它用“d”替换整个字符串。
任何解释或帮助都会很棒!
编辑:
我尝试了另一个正则表达式,
\[([^\]]{0})\]
这个适用于括号不包含内部括号而内部没有其他内容的情况。但它不适用于所描述的情况。
答案 0 :(得分:5)
您需要知道.
点是特殊字符,表示“新线标旁边的任何字符”,而*
是贪婪的,因此它会尝试找到最大匹配。
在正则表达式\[(.*[^(\]|\[)].*)\]
中,.*
代表[
和[^(\]|\[)].*)\]]
之间的最大字符集,此部分可以理解为非[
或{ {1}}字符,可选的其他字符]
,最后是.*
。所以这个正则表达式将匹配你的整个输入。
要解决该问题,请从正则表达式中删除]
。此外,您无需在.*
内使用|
或(
)
。
[^...]
输出:System.out.println("[[a][b][[c]]]".replaceAll("\\[[^\\]\\[]\\]", "d"));
答案 1 :(得分:1)
\[(\[a\])(\[b\])\[(\[c\])\]\]
如果你需要在当前上下文中加倍反斜杠(例如你将它放在“”样式字符串中):
\\[(\\[a\\])(\\[b\\])\\[(\\[c\\])\\]\\]
a
,b
和c
的示例替换为[^\]]*
,或者如果您需要转义反斜杠[^\\]]*
。
现在,您可以使用d
替换捕获一个,捕获两个并捕获三个。
如果您要替换的字符串不完全符合该格式,那么您希望使用
进行全局替换 (\[a\])
替换a
,
(\[[^\]]*\])
加倍反斜杠,
(\\[[^\\]]*\\])
答案 2 :(得分:1)
试试这个:
System.out.println("[[a][b][[c]]]".replaceAll("\\[[^]\\[]]", "d"));
如果a,b,c在真实世界中有多个字符,请使用:
System.out.println("[[a][b][[c]]]".replaceAll("\\[[^]\\[]++]", "d"));
我们的想法是使用包含除[
和]
之外的所有字符的字符类。该类是:[^]\\[]
,模式中的其他方括号是文字。
请注意,字面关闭方括号不需要在字符类的第一个位置和字符类之外进行转义。