我正在尝试构建一个使用正则表达式之类的工具来查找字符串中的模式(不是文本字符串,但这现在并不重要)。我熟悉自动机理论,即我知道如何实现基本的正则表达式匹配,如果字符串匹配我的正则表达式,则输出真或假,通过以教科书的方式模拟自动机。
假设我对 s 之前的所有a
s 感兴趣,在 s 之前b
没有更多a
的b
s,所以,这个正则表达式:a[^a]*b
。但我不只是想知道我的字符串是否包含这样的部分,我想将 . 作为输出a
,以便我可以检查它(请记住,我实际上不是在处理文本)。
总结:假设我a
用括号标记 ,如下所示:(a)[^a]*b
然后在输入字符串上运行它,bcadacb
然后我想要第二个a
作为输出。
或者,更一般地说,可以找出输入字符串中的哪些字符与正则表达式的哪一部分匹配吗?它是如何在文本编辑器中完成的?他们至少知道比赛从哪里开始,因为他们可以突出显示比赛。我必须使用回溯方法,还是有更智能、计算成本更低的方法?
编辑:正确的反向引用,即用括号捕获和用 \1 引用等可能不是必需的。我确实知道反向引用确实需要回溯(或类似的东西)并使问题(IIRC)NP-hard。从本质上讲,我的问题是:在没有反向引用的情况下,捕获部分的计算成本是否比正确的反向引用低?