Ruby正则表达式:匹配没有匹配的< >

3

以下是XML示例:

<Comment>10 < 100</Comment>

我希望能够正确识别内部的<,以便能够将其删除,但我希望保留所有其他内容不变。
我假设这将涉及某种[?]选项,但在rubular上进行实验时我还没有成功找到解决方法。
注意:我们正在使用XML解析器rexml,但它无法处理上述情况。相反,Nokogiri无法处理内容中的&符号。

不要试图使用正则表达式来解析XML(或HTML或SGML或您喜欢的编程语言等)。这是行不通的。正则表达式无法处理这些语言。通常,每当您必须匹配平衡分隔符(括号,任何形状的方括号,XML标记)时,您已经超出了正则表达式所能实现的范围。一些语言通过机制扩展了“正则表达式”,以便以某种方式与周围的编程语言相结合,让您可以做到其中的一些事情,但最终您会得到一个垃圾代码,它是一个单一技巧的马戏团。请使用XML解析器。 - Mark Reed
2
虽然那不是有效的XML,但符合标准的XML解析器不应该崩溃吗? - Frederick Cheung
2
我们正在使用一个XML解析器。由于我们无法控制XML,所以在一些边缘情况下,当非有效的XML返回给我们时,我们需要尽可能地修复它,以便我们的功能能够正常工作。为此,我们正在进行一些类似黑客的操作。 - DVG
1个回答

3
这会查找并转换未被>跟随的<:
result = subject.gsub(/<(?![^<>]*>)/, '&lt;')

解释:

<        # Match a <
(?!      # only if the following regex can't match here:
 [^<>]*  # any number of characters except angle brackets
 >       # followed by a closing angle bracket.
)        # (End of negative lookahead assertion)

3
不用谢。我总是很喜欢当人们看到“XML”和“regex”时,立刻给出膝反应式答案“使用解析器”,却没有意识到解析器会在处理无效的“XML”时失败。至少这次他们没有链接到无益的克苏鲁答案 :) - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接