下面列出的正则表达式(. NET/C #风格或PS风格)逐行匹配简单XML文件中的元素和内部文本(不需要多行匹配)。
^[^<]*<(?'Element'[^>\s]*)[^>]*>(?'Text'[^<]*)<\/\1>\s*$
这个正则表达式可以正确、高效地匹配以下输入:
请参见online simulation。
<ELEMENT>inner text</ELEMENT>
<ELEMENT>inner text</ELEMENT>
<ELEMENT>inner text</ELEMENT>
<ELEMENT > inner text </ELEMENT>
<ELEMENT > inner text </ELEMENT>
<ELEMENT > inner text </ELEMENT>
<ELEMENT ATTRIB="foo"> inner text </ELEMENT>
<ELEMENT ATTRIB="foo"> inner text </ELEMENT>
然而,不应该匹配的情况正确地执行,但是它们招致大量回溯,因此效率非常低:
参见online simulation。
ELEMENT ATTRIB="foo"> inner text </ELEMENT>
< ELEMENT ATTRIB="foo"> inner text </ELEMENT>
< ELEMENT ATTRIB="foo"> inner text </ELEMENT>
<ELEMENT>inner text</FOO>
ELEMENT ATTRIB="foo"> inner text </ELEMENT>
- 问题**:我可以使用原子组来防止这种回溯,并在不降低匹配性能的情况下加快不匹配性能吗?
如果. Net & PS支持所有格量词,我也会问它们。
附言
- 这个问题不仅适用于XML输入。它是关于. NET或PS中原子组的一般正则表达式优化--而不是关于处理这个特定的XML输入。*
1条答案
按热度按时间5gfr0r5j1#
是否可以使用原子组来防止这种回溯,并在不降低匹配性能的情况下加快不匹配性能
不。每次在一个模式中使用
*
(零或更多)时,根据其定义,它将使用回溯来查找可能发生的每一个事件。你的模式是如此的“回溯友好”,以至于为这个问题提供一个你想做的一切的答案是鲁莽的。
Regex是模式匹配工具而不是词法分析工具,我相信你在这种情况下把两者弄混了。
正如评论中提到的,使用更适合HTML或XML的工具来解析和分析数据。