2017-10-05 107 views
0

我試圖刪除字符串中的所有[。*],但不刪除![CDATA [xxx]]。 我期待下面的結果替換![CDATA [xxx]]中的所有匹配[。*]而無需替換CDATA

"""![CDATA[please remove[macro]]]""" 
    .replaceAll("""(?<!CDATA)\[(?!CDATA).*\]""", "") 

shouldBe這樣

![CDATA[please remove]]

但結果是

![CDATA[please remove

+1

XML不適合正則表達式,因此使用合適的解析器可能是更好的選擇。 – Thomas

+0

順便說一句,你是如何調用'replaceAll(regex,「」)'來添加''等? – Thomas

+0

對不起我複製太多東西 –

回答

1

正如我已經說過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是不規則的語言)。

+0

不幸的是,不是CDATA可以包含宏,它並不總是包含宏 –

+0

@MaxenceCramet我已經編輯了答案,請再閱讀一次。 – Thomas

+0

感謝您快速,完整的回答! 我的字符串是一個完整的XML,我不確定要理解你的警告,你有一個可以幫助我理解的例子嗎? –