一個很難的字串問題
阿新 • • 發佈:2019-01-23
問題描述:
有 n 個 RegEx (正則表示式),標號從 0 到 n-1,n 可能很大 (比如說100萬)
給定一個字串,返回能 match 這個字串的所有正則表示式標號。
用 C++ 來描述這個需求:
class MultiRegEx { public: struct MatchResult { int nth; // regex NO. int beg; // begin of matched pos in text int end; // end of matched pos in text }; // return the index NO. of the internal regex object, -1 indicate error int add(const char* regex); // compile the MultiRegEx bool compile(); // length is the length of text vector<MatchResult> match(const char* text, int length) const; };
這個問題看上去簡單,但其實現非常複雜!一個簡單生硬的實現是,隨便拿一個正則表示式引擎(如boost.regex, pcre, re2, ...),match 時逐個匹配,匹配成功的,加入返回值集合。但這個時間複雜度太高!
原則上,unix 下的 lex 可以匹配多個 RegEx,並返回那個被匹配的 RegEx 標號,但好像無法識別多個成功的 RegEx 匹配。
這個問題的一個簡化版:這 n 個 RegEx 只是簡單的 PlainString,就是 Multi String Match 問題,甚至是這個簡化版,其實現複雜多都相當高(trie, double array, ...)。
我找了很多資料,好像都沒有特別合適的辦法。
2013-08-31:
google re2 中有同時匹配多個正則表示式的功能,可惜還是有些缺陷,正在做自己的引擎,克服那些缺陷