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