在xml字符串中替换所有正则表达式

时间:2014-08-21 13:03:04

标签: java xml regex

我正在尝试手动为我的xml字符串添加一些前缀,为此我需要一个我似乎无法找到的特定java表达式,基本上这是我的字符串:

 <?xml version="1.0" encoding="UTF-8"?>
<mediabericht xmlns:mb="http://www.mediabericht.org"><inhoud>Randominhoud 22</inhoud><netwerk>Twitter</netwerk><datum>1408625886036</datum><film>Gladiator</film></mediabericht>

我想为我的元素添加前缀,所以它应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
    <mb:mediabericht xmlns:mb="http://www.mediabericht.org"><mb:inhoud>Randominhoud 22</mb:inhoud><mb:netwerk>Twitter</mb:netwerk><mb:datum>1408625886036</mb:datum><mb:film>Gladiator</mb:film></mb:mediabericht>

我想做一些替换,但到目前为止我没有运气

我需要解决的第一个正则表达式是< but not <? or </并使用replaceAll函数将它们替换为<mb:(前缀)

然后我处理了第二次替换:

String prefixedString = xmlString.replaceAll("</", "</mb:");

3 个答案:

答案 0 :(得分:1)

  

我需要解决的第一个正则表达式是< but not <? or </并使用replaceAll函数将这些替换为<mb: (the prefix)

这可以使用look-ahead来解决:

String prefixedString = xmlString.replaceAll("<(?![/?])", "<mb:");

答案 1 :(得分:1)

您可以尝试使用Lookaround

  

Lookaround(零长度断言)实际匹配字符,但随后放弃匹配,仅返回结果:匹配或不匹配。

<(?!\/|\?)

替换:<mb:

OR

(?<=<)(?!\/|\?)

替换:mb:

Online demo

彭定康解释:

  (?<=                     look behind to see if there is:
    <                        '<'
  )                        end of look-behind
  (?!                      look ahead to see if there is not:
    \/                       '/'
   |                        OR
    \?                       '?'
  )                        end of look-ahead

示例代码:

System.out.println("<abc></abc>".replaceAll("(?<=<)(?!\\/|\\?)", "mb:"));  

或者只是使用@Avinash Raj建议的<\b,其中\b被用作字边界

System.out.println("<abc></abc>".replaceAll("<\\b", "<mb:")); 

答案 2 :(得分:1)

只需一个正则表达式即可完成所有操作:

String prefixedString = xmlString.replaceAll("(</?)([^?])", "$1mb:$2");

只会在一次<?xml>来电中正确替换开始和结束标记(并忽略replaceAll()标记)。