2017-04-26 10 views
0

내 xml 파일에 &&으로 바꿔야합니다.CDATA 태그의 Java 패턴 및 Matcher

//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 파일을 포함하는 String 변수 인 것으로 추측 :

l_retour = l_retour.replaceAll("&amp;", "&");으로 충분합니다.

+0

합니다. CDATA 태그로 대체하기 때문에이 작업을 수행 할 수 없습니다. 'replace! '는 내부적으로'replaceAll()';을 사용합니다.) ' – MelodyBibi

+0

@Vasan funnily – Thomas

0

스택 트레이스를 살펴본 결과 replaceFirst(...)임을 알 수 있습니다. 따라서 귀하의 문제는 temp2.replaceFirst(Pattern.quote(m.group()),m.group().replaceAll("&amp;", "&"));으로 전달되는 것으로 가정합니다. 대개 두 번째 매개 변수는 정규식으로 해석됩니다 (예 : $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 ... 아야)에 넣은 사람들을 알고 있습니다. 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); 
} 

답변 주셔서 감사 당신 탄트