正则表达式排除方括号

5

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

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

基本上,它应该采取这个:

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

并能够替换为:

[dd[d]]

abc和d没有关联。不用说,正则表达式部分是不起作用的。在这种情况下,它将整个字符串替换为"d"。

任何解释或帮助都将是极好的!

编辑:

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

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

这个方法适用于括号内不包含其他括号和其他内容的情况,但对于描述的情况不起作用。

尝试从你的第一个正则表达式中移除 .* - Pshemo
谢谢,但我不认为这对我有任何改变。 - eatonphil
3个回答

7
你需要知道.点是一个特殊字符,表示“除换行符之外的任何字符”,*是贪婪的,因此它会尝试找到最大匹配。
在你的正则表达式\[(.*[^(\]|\[)].*)\]中,第一个.*将表示[[^(\]|\[)].*)\]]之间的最大字符集,这部分可以理解为非[]字符、可选的其他字符.*,最后是]。因此,这个正则表达式将匹配你的整个输入。
为了消除这个问题,从你的正则表达式中删除两个.*。此外,你不需要在[^...]内使用|( )
System.out.println("[[a][b][[c]]]".replaceAll("\\[[^\\]\\[]\\]", "d"));

输出:[dd[d]]

1

试试这个:

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

如果a、b、c在现实世界中不止一个字符,请使用以下代码:
System.out.println("[[a][b][[c]]]".replaceAll("\\[[^]\\[]++]", "d"));

这个想法是使用一个字符类,其中包含所有字符,但不包括[]。字符类是:[^]\\[],模式中的其他方括号都是字面值。
请注意,在字符类的第一个位置和字符类外部,字面上的闭合方括号不需要转义。

1

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

如果您需要在当前上下文中使用双反斜杠(例如,您将其放置在“”样式字符串中):

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

对于abc的示例替换是[^\]]*,或者如果您需要转义反斜杠,则为[^\\]]*。 现在,您可以将捕获一、捕获二和捕获三分别替换为d
如果您要替换的字符串不完全符合该格式,则需要进行全局替换,使用 (\[a\]) 替换 a
使用双反斜杠 (\\[[^\\]]*\\]) 替换 (\[[^\]]*\])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接