我试图删除字符串中的所有[。*]但不删除![CDATA [xxx]]。 我期待以下结果
"""![CDATA[please remove[macro]]]"""
.replaceAll("""(?<!CDATA)\[(?!CDATA).*\]""", "")
shouldBe这样
![CDATA[please remove]]
但结果是
![CDATA[please remove
答案 0 :(得分:1)
正如我已经说过,XML不适合正则表达式但是如果你的输入总是看起来像![CDATA[something [macro] something ... ]]
,那么宏不包含空格(在大多数情况下它不包含空格)无论如何都有意义)并且没有其他字符串可能看起来像你可以做这样的事情:
String replaced = "![CDATA[please remove[macro]]]".replaceAll("(?<!CDATA)\\[\\w+\\]", "" );
表达式(?<!CDATA)\[\w+\]
:
(?<!CDATA)
是一个负面的后卫,即匹配不能直接在CDATA
之前。是为了防止没有宏的CDATA元素匹配)\[\w+\]
匹配由方括号括起的任何单词字符序列(\w
等同于[a-zA-Z0-9_]
),例如它会匹配[please_remove]
但不匹配 [please remove]
。使用该表达式,您将在![CDATA[ somthing [macro] somthing [another_macro]]] ... [macro_outside] ... [not a macro] ... ![CDATA[empty]]
上获得以下匹配项:
[macro]
[another_macro]
[macro_outside]
但请允许我再次重申:这只有在您知道输入字符串看起来像什么或不关心它们是否与您的要求不符合时才会起作用(如果您接受任何输入)因为XML是一种不规则的语言,因此肯定会出现你想要它们不匹配的情况。