2017-04-26 6 views
0

xmlファイルに&&と置き換えたいと思います。ここでCDATAタグのJavaのパターンとマッチャ

は私のコードです:

//On match sur tous les <!CDATA[ ... ]> 
Pattern p = Pattern.compile("<!\\[CDATA\\[((&amp;)|[^\\]]|\\][^\\]]|\\]\\][^>])*\\]\\]>"); 
Matcher m = p.matcher(l_retour.toString()); 

String temp2 =""; 
temp2 = l_retour.toString(); 
while(m.find()){ 
     //Si il y a un '&amp;' 
     if(m.group(2) != null){ 
       //On remaplace les &amp; remplacés précédement par un '&' simple car on se trouve dans une balise <!CDATA[]> 
       temp2 = temp2.replaceFirst(Pattern.quote(m.group()),m.group().replaceAll("&amp;", "&")); 
     } 
} 

実行中にエラーがあります。

04 26 17:02:48,733 FATAL ExporteXml: Illegal group reference 
04 26 17:02:48,733 FATAL ExporteXml: java.util.regex.Matcher.appendReplacement(Matcher.java:808) 
04 26 17:02:48,733 FATAL ExporteXml: java.util.regex.Matcher.replaceFirst(Matcher.java:955) 
04 26 17:02:48,733 FATAL ExporteXml: java.lang.String.replaceFirst(String.java:2119) 

私はそれが私の正規表現が、y解決策を見つけることができませんでしただと仮定し...あなたのために事前による おかげで答え

答えて

0

l_retourは、XMLファイル全体を含む文字列変数であると推測します。

l_retour = l_retour.replaceAll("&amp;", "&");で十分です。

+0

を。私はCDATAタグで置き換えたいので、これを行うことはできません。 'replace!'(内部で 'replaceAll()';を使用しています) '' @!CDATA [ここではテキストを置き換えます]]> ' – MelodyBibi

+0

@Vasan funnily – Thomas

0

スタックトレースを見ると、それはreplaceFirst(...)であることに気付くでしょう。したがって、私はあなたの問題がtemp2.replaceFirst(Pattern.quote(m.group()),m.group().replaceAll("&amp;", "&"));に渡したものだと仮定します。おそらく、これは正規表現で解釈される2番目のパラメータです($1などのグループ参照を許可するため)。

しかし、あなただけの試合の内側&amp;を置き換え、それをする必要はありません。

StringBuffer result = new StringBuffer(); 
while(m.find()) { 
    String replacement = m.group(); 
    if(m.group(2) != null){ 
    replacement = replacement.replace("&amp;", "&"); 
    } 
    m.appendReplacement(result, replacement); 
} 
m.appendTail(result); 

あなたも、あなたの表現で&amp;をチェックするだけで、すべてのCDATAsを取得し、任意の&amp;を交換する必要はないかもしれません。何も存在しない場合、何も置き換えられません。

しかし、私は警告:などの不規則な言語に正規表現を適用するXMLは災害のためのレシピです!あなたのCDATAに含まれるものが分からない限り、すべてのものに一致するパターンは見つからない可能性があります(たとえば、XMLをCDATA ... ouchに入れる人のことを知っています)。 XMLを扱うときは通常、適切なXMLパーサを使用する方が良いでしょう。

0

私はあなたに耳を傾け、私は単純に、この操作を行います。あなたの答えのためのあなたのウ・タント

//On match sur tous les <!CDATA[ ... ]> 
Pattern p = Pattern.compile("<!\\[CDATA\\[.+\\]\\]>"); 
Matcher m = p.matcher(l_retour.toString());    
String result = l_retour.toString(); 
String replacement = "", replacementTmp = ""; 
while(m.find()){ 
    replacementTmp = m.group(); 
    //On remaplace les &amp; remplacés précédement par un '&' simple car on se trouve dans une balise <!CDATA[]> 
    replacement = replacementTmp.replace("&amp;", "&"); 
    int indexBegin = result.indexOf(replacementTmp); 
    int indexEnd = result.length() - 1; 
    result = result.substring(0, indexBegin) + replacement + result.substring(indexBegin + replacementTmp.length(), indexEnd); 
} 

おかげ

関連する問題