我試圖刪除字符串中的所有[。*],但不刪除![CDATA [xxx]]。 我期待下面的結果替換![CDATA [xxx]]中的所有匹配[。*]而無需替換CDATA
"""![CDATA[please remove[macro]]]"""
.replaceAll("""(?<!CDATA)\[(?!CDATA).*\]""", "")
shouldBe這樣
![CDATA[please remove]]
但結果是
![CDATA[please remove
我試圖刪除字符串中的所有[。*],但不刪除![CDATA [xxx]]。 我期待下面的結果替換![CDATA [xxx]]中的所有匹配[。*]而無需替換CDATA
"""![CDATA[please remove[macro]]]"""
.replaceAll("""(?<!CDATA)\[(?!CDATA).*\]""", "")
shouldBe這樣
![CDATA[please remove]]
但結果是
![CDATA[please remove
正如我已經說過XML是不是一個好適合正則表達式但如果你的輸入總是看起來l IKE ![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]
但是,讓我再次重申:這僅適用於如果你知道輸入的字符串可以是什麼樣的或不是汽車e如果它們不符合您的要求時不起作用(如果您接受任何輸入,肯定會遇到不符合您要求的情況 - 因爲XML是不規則的語言)。
不幸的是,不是CDATA可以包含宏,它並不總是包含宏 –
@MaxenceCramet我已經編輯了答案,請再閱讀一次。 – Thomas
感謝您快速,完整的回答! 我的字符串是一個完整的XML,我不確定要理解你的警告,你有一個可以幫助我理解的例子嗎? –
XML不適合正則表達式,因此使用合適的解析器可能是更好的選擇。 – Thomas
順便說一句,你是如何調用'replaceAll(regex,「」)'來添加''等? –
Thomas
對不起我複製太多東西 –