1. 程式人生 > >一個很難的字串問題

一個很難的字串問題

問題描述:

有 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 中有同時匹配多個正則表示式的功能,可惜還是有些缺陷,正在做自己的引擎,克服那些缺陷