regex 如何使用原子组加速正则表达式?

ubof19bj  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(73)

下面列出的正则表达式(. 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输入。*
5gfr0r5j

5gfr0r5j1#

是否可以使用原子组来防止这种回溯,并在不降低匹配性能的情况下加快不匹配性能
不。每次在一个模式中使用*(零或更多)时,根据其定义,它将使用回溯来查找可能发生的每一个事件。
你的模式是如此的“回溯友好”,以至于为这个问题提供一个你想做的一切的答案是鲁莽的。
Regex是模式匹配工具而不是词法分析工具,我相信你在这种情况下把两者弄混了。
正如评论中提到的,使用更适合HTML或XML的工具来解析和分析数据。

相关问题