2017-10-05 9 views
0

文字列の[。*]をすべて削除しますが、[CDATA [xxx]]は削除しません。 私は、次のような結果を期待していCDATAを置換せずに![CDATA [xxx]]に一致するものをすべて置換してください。

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

shouldBe

![CDATA[please remove]]

しかし、私はすでにXMLは、に適していないです言ったように、結果は

![CDATA[please remove

+1

XMLは正規表現にはあまり適していないので、適切なパーサーを使用する方が適切なオプションかもしれません。 – Thomas

+0

Btw、 'replaceAll(regex、") 'は' 'などを追加するためにあなたの呼び出しはどうですか? – Thomas

+0

申し訳ありませんが、あまりにも多くのものをコピーします。 –

答えて

1

です正規表現が入力されている場合常に l IKE ![CDATA[something [macro] something ... ]]、すなわちマクロあなたはこのような何かを行うことができます(ほとんどの場合、とにかく意味がありません)空白を含まないとマクロのように見えるかもしれない他の文字列が存在しないんの

String replaced = "![CDATA[please remove[macro]]]".replaceAll("(?<!CDATA)\\[\\w+\\]", ""); 

内訳表現(?<!CDATA)\[\w+\]:一致が直接CDATAが先行してはならない。すなわち

  • (?<!CDATA)は、ネガティブルックの背後にあります。 (\w[a-zA-Z0-9_]に相当します)の任意の文字列にマッチするかどうかは、大括弧で囲まれています。 [please_remove]と一致しますが、ではなく、[please remove]と一致します。

    • [macro]
    • [another_macro]
    • [macro_outside]

    しかし、私は再び繰り返すみましょう:こののみ動作しますが、![CDATA[ somthing [macro] somthing [another_macro]]] ... [macro_outside] ... [not a macro] ... ![CDATA[empty]]で次のマッチを取得したいという表現を使用して

入力文字列がどのように見えるかわからない場合はあなたの要件に合っていないとうまくいかない場合は(もしXMLが不規則な言語なので、あなたが望むように一致しない状況があると受け入れるならば)

+0

残念ながら、CDATAにはマクロが含まれている可能性があります。マクロは常に含まれているとは限りません。 –

+0

@MaxenceCramet答えを編集しました。 – Thomas

+0

お返事ありがとうございました! 私の文字列は完全なXMLです。私はあなたの警告を理解していないのですが、わかりやすい例がありますか? –

関連する問題