2016-08-26 9 views
2

に私のXMLは、以下のように見えるコメントを外しXML要素のJava

<!-- Service Defs --> 

<!-- <serviceName = "${NASA_Freedom.level.mission}" 
       MaxTimeOut = "20" minSpareHyperThread = "10" /> 
--> 

そして、私はちょうどserviceNameの要素のコメントを解除する必要があります。

<serviceName = "${NASA_Freedom.level.mission}" 
       MaxTimeOut = "20" minSpareHyperThread = "10" /> 

次のコードを実行していないようですトリック:

Pattern p = Pattern.compile("(<!--).*<serviceName = \\"${NASA_Freedom.*(-->)"); 
Matcher m = p.matcher(test); 
if (m.find()) { 
    System.out.println(m.replaceAll("")); 
} 

これはまた、これを処理する悪い方法のようです。残念ながら、XMLファイルについては何もできませんので、これが唯一の方法です。上記のようにコメントを解除するにはどうすればよいですか?

+0

は、あなたのコードは、コンパイルべきではありません。 – Laurel

+0

あなたのXMLは整形式ではなく、属性名はありません –

+0

@NicolasFilotto - 残念ながら、それは大丈夫です。 – sln

答えて

1

これは一つの方法に影響を与えないようすることができたキャプチャグループに-->を持つ防ぐために、ゼロ幅の負の先読みを追加

検索:"<!--(?:(?!-->)[\\S\\s])*?(<serviceName\\s+(?:(?:(?:\"[\\S\\s]*?\")|(?:'[\\S\\s]*?'))|(?:[^>]*?))+\\s*/>)[\\S\\s]*?-->"

置換:"$1"は、基本的にグループ0を文字列のグループ1に置き換えます)

は拡張:

<!-- 
(?: 
     (?! -->) 
     [\S\s] 
)*? 

(       # (1 start) 
     <serviceName \s+ 
     (?: 
      (?: 
       (?: " [\S\s]*? ") 
      | (?: ' [\S\s]*? ') 
      ) 
     | (?: [^>]*?) 
    )+ 
     \s* /> 
)        # (1 end) 

[\S\s]*? --> 

入力:

<!-- Service Defs --> 

<!-- <serviceName = "${NASA_Freedom.level.mission}" 
       MaxTimeOut = "20" minSpareHyperThread = "10" /> 
--> 

出力:あなたが適切にエスケープされていないので、

** Grp 0 - (pos 25 , len 122) 
<!-- <serviceName = "${NASA_Freedom.level.mission}" 
       MaxTimeOut = "20" minSpareHyperThread = "10" /> 
--> 
** Grp 1 - (pos 30 , len 112) 
<serviceName = "${NASA_Freedom.level.mission}" 
       MaxTimeOut = "20" minSpareHyperThread = "10" /> 
1

は、この正規表現を使用してみてください:

<!--\s*(<serviceName\s*=\s*\"\${NASA_Freedom.level.mission}\".*?)\s*--> 

それはあなたのJava構文が有効であるように、適切な文字に、このような引用符をエスケープすることが重要です。パターンは複数行にまたがって一致するように

あなたは(基本的には改行文字に対して.にマッチする正規表現エンジンに指示します)Pattern.compileに引数としてPattern.DOTALLを使用したいと思います。

各一致をキャプチャグループ1の内容で置き換えると、コメントが削除されます。

EDIT:

あなたが代わりにコメントが一致し、空の文字列に置き換えることにより、それらを削除し、代わりにこの正規表現を使用する場合:

(<!--\s*)<serviceName\s*=\s*\"\${NASA_Freedom.level.mission}\".*?(\s*-->) 

は、基本的にはちょうど最初の正規のグループを反転さ表現。あなたに次の続行することができます与えられたパターのコメントを解除するには

+0

マッチはむしろコンテンツであり、コメントの権利ではありませんか?私がコメントを囲むと(<! - )、次に置き換えられません。 –

+0

これは内容が一致しているので、一致するテキストをグループ1の内容に置き換える必要があります。コメントの一致の逆の種類と空の文字列で置き換えます。 –

+0

@TimFalonyコメントを置き換える際にロジックを維持できるように編集を追加しました –

1

Pattern p = Pattern.compile(
    "(?s)<!--(.*" + 
    Pattern.quote("<serviceName = \"${NASA_Freedom.level.mission}\"") + 
    "((?!-->).)*)-->" 
); 
System.out.println(p.matcher(xml).replaceAll("$1")); 

あなたが必要になります。

  1. dotall modeを有効にするフラグsを設定するには、それは複数行の内容であるように私たちがすることを望みますドットもラインターミネータをカバーします。
  2. パターンを引用するにはPattern.quote(String)を使用する必要があります。
  3. finall y式全体を、ここでは<!---->の間にあるものに対応する最初のキャプチャグループに置き換えます。

NB:一度この表現は、それがうまくもはや形成されないようブレーキあなたのXMLを意志コメントを外し。

NB2:は、私は他の人のコメント

+0

最初の開始コメント(Service Defsの前)と最後の終了コメントを削除します。 –

+0

が固定されています。キャプチャされたグループに - >が含まれないようにするには、幅がゼロの負の先読みを使用してください。もう一度確認してください –

関連する問題