增量正则表达式匹配

时间:2019-01-31 05:44:03

标签: regex incremental-search

问题:程序需要从输入的字符流中读取,并将输入与预定义的正则表达式模式列表进行匹配。程序应在找到匹配项后立即报告该匹配项(如果存在多个,则报告所有),或者在整个流被消耗而没有任何匹配项后报告失败。输入可能不会一次全部出现,因此只要程序在输入流上调用read,就有可能读取零个,一个或多个字符。

简单的解决方案是缓冲到目前为止已读取的所有字符,并尝试将其与整个正则表达式模式组进行匹配。但这不是很有效。正则表达式匹配本质上是有状态的,因此应该有一个不缓冲输入的方法。理想情况下,存在一种使用类似于Aho-Corasick的技术进行单字符串匹配的单遍解决方案。我搜索了现有的库,但没有找到能够进行这种增量正则表达式匹配的库。哪些库或算法可以提供帮助(首选C,C ++,Python或Perl库)?

一个现有的解决方案通过-小的正则表达式模式来形成一个巨大的正则表达式模式。但是我不确定这是否比迭代小的正则表达式更快。这不是增量匹配:每次匹配都需要整个缓冲的输入。

不能重复以下操作:Incremental Pattern (RegEx) matching in Java?那里的已接受答案显示了方向,但没有具体解决方案。其他用户报告说,合并的FSA会导致很大的内存占用,但是该答案并未提及如何进行优化以使其实用。


有助于解决问题的Python框架:

regex_list = [ r'0+', r'1+', r'2+', r'3+' ]
class Matcher:
    def match(self):
        ...
        buffer += sys.stdin.read()
        ...
        return ([ matched_regex, ... ], matched_token)
matcher = Matcher()
while True:
    matched_regex_list, token = matcher.match()

0 个答案:

没有答案