【问题标题】:ReplaceAll regex in xml string [duplicate]ReplaceAll xml字符串中的正则表达式[重复]
【发布时间】:2014-08-21 13:03:04
【问题描述】:

我正在尝试为我的 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>

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

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

然后我处理的第二个替换:

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

【问题讨论】:

  • 要在&lt;mediabericht前面加空格吗?
  • 呃,不,我为什么要那样做?
  • 我找不到输入和预期输出的差异。
  • 抱歉我没有编辑第二个,它应该有前缀
  • 正确的方法是解析 XML 树,而不是正则表达式。

标签: java xml regex


【解决方案1】:

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

这可以使用look-ahead解决:

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

【讨论】:

  • 替换这个错误后终于成功了,非常感谢!
【解决方案2】:

你可以只用一个正则表达式做所有事情:

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

只会在一次replaceAll() 调用中正确替换开始和结束标记(并忽略&lt;?xml&gt; 标记)。

【讨论】:

  • 编辑:Nvm 这行得通,谢谢,这使它更简单
【解决方案3】:

你可以试试Lookaround

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

<(?!\/|\?)

替换:&lt;mb:

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

替换: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 在下面 cmets 中的建议使用&lt;\b,其中\b 用作单词边界

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

【讨论】:

  • 谢谢你的解释,我真的应该花一个下午的时间学习模式,到目前为止,我总是在 stackoverflow 上查找或询问它们
  • @user 你可以简单地使用这个(?&lt;=&lt;)\bregex101.com/r/oE7rZ9/3
  • @AvinashRaj 是的,这也是正确的。好东西。或者保持简单&lt;\b
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 2023-03-19
相关资源
最近更新 更多