2017-04-26 37 views
0

我想在我的xml文件中将&替换为&Java中的CDATA标记中的模式和匹配器

这里是我的代码:

//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标记中进行替换。 ''[CDATA [这是我的文本替换]]>' – MelodyBibi

+0

@Vasan funnily但'replace()'在内部使用'replaceAll()';) – 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); 
} 

感谢