正则表达式匹配没有子节点的xml元素

时间:2014-07-21 08:58:42

标签: xml regex

我很惊讶我无法找到这个,所以如果有人只是把它作为副本关闭,并指出我正确的方向,这是伟大的但是

我有xml,有时文本节点很简单,即

<text>Sometext</text>

有时很复杂

<text in_force_from="20061231" newpara="N">
   <changed-by in_force_from="20140101">PRA 2013/34</changed-by>
   <changed-by in_force_from="20061231">2006/40</changed-by>
    This section applies to:
</text>

我想匹配所有简单的(例如<text>Sometext</text>),所以这样的事情

<text [\S\s]*?>[^<]*?</text>

或者

<text [\S\s]*?>(?!<)*</text>

但它导致记事本++陷入停顿。我怀疑它已越过节点并尝试匹配下一个文本结束标记,即使这是5000行并且不是该节点的一部分。

我想要它做的是

  1. 查找文字标记
  2. 此文字标记是否包含
  3. 中的其他标记
  4. 如果是,则匹配
  5. 如果没有,则不要继续这场比赛。去找下一个文本标签
  6. 这是造成问题的第四步。有任何想法吗?在正则表达式中这甚至可能吗?我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:2)

请勿尝试使用正则表达式执行此操作。你会弄错的。这不仅仅是因为它很难,而且因为它在理论上是不可能的。正则表达式只能用于处理一类称为常规语言的语言,而XML在这种意义上不是常规语言。

作业的工具是XPath,你需要的表达式是// text [not(*)]。

答案 1 :(得分:0)

s(DOTALL)修饰符添加到模式中,使点也匹配新的线条字符,

/<text\b.*?<\/text>/sg

对于简单节点,

<text[\S ]*?>.*?<\/text>

DEMO