1

共通 API regex(string, pattern) を提供せず、(パターンに基づいて) 有限状態マシンを構築できる C/C++ の正規表現ライブラリを探しています。

fsm = create_fsm();
add_pattern(fsm, "foo", hookFoo);
add_pattern(fsm, "bar", hookBar);
compile_fsm(fsm);
while ((c = fgetc(file) != EOF) {
   next_char(fsm, c);
}

そして、パターンが一致した場合、hookFoo(match start, match end) が呼び出されますか? またはそれに似たもの、これは単なる概念です。長い、長い行で複数の正規表現を検索したいと思います。理想的には、後方検索のために逆方向にも入力できる場合。式は実行時にのみ認識されるため、Flex (または同様のパーサー ジェネレーター) はオプションではありません。

編集: lexertl を正しい答えとしてマークしましたが、それは私が探していたものではないようです。ストリームに戻る必要があります。過去を思い出すためにメモリを使用したくありません(最後の文字を思い出すなどの一定サイズ以外)。++iterator を呼び出すと、他のすべてのイテレータが無効になると想像してください。

4

4 に答える 4

2

lexertlは、要件に向けて長い道のりを歩んでいるようです実行時の正規表現の追加と「再起動可能な」レクサーの両方をサポートしています。認識された「ルール」ごとにトークンが提供されます。

boost::spirit::lexはデフォルトの実装として lexertl を使用し、セマンティック アクションを追加します。

于 2013-01-09T15:18:01.287 に答える
1

#include<regex.h>likeregcompが提供する関数を使用して、独自の関数を開発できます。regexec

int  match_patterns(char *pch,char *pattern)
{
    regex_t             *regex;
    regmatch_t          *result;
    int                 err_no = 0;
    int                 start = 0;

    regex = (regex_t *) calloc(1,sizeof(regex_t));
    if((err_no = regcomp(regex, pattern, REG_EXTENDED)) != 0)
    {
        size_t          length;
        char            *buffer;
        length = regerror (err_no, regex, NULL, 0);
        buffer = malloc(length);
        regerror (err_no, regex, buffer, length);
        free(buffer);
        regfree(regex);
        return -1; //error
    }
    result = (regmatch_t *) calloc(1,sizeof(regmatch_t));
    if(result == NULL)
    {
        return -1; //error
    }
    while(regexec(regex, pch+start, 1, result, 0) == 0)
    {
        start +=result->rm_eo;
    }
    regfree(regex);
    free(regex);
    if((result->rm_so == 0)&&(result->rm_eo == strlen(pch)))
    {
        return 0; //OK
    }
    return -1; //error
}

この関数は、pch文字列が正規表現パターンと一致する場合は 0 を返し、一致しない場合はpattern-1 を返します。

int main()
{
    if (match_patterns("1234.abc", "[0-9]+.[a-d]+")==0)
        printf("OK!\n");
    else
        printf("NOK!\n");

}

このmatch_patterns()場合、 は 0 を返します

この関数を使用する場合は、次のインクルードを忘れずに追加してください。

#include<regex.h>
#include<string.h>
于 2013-01-09T15:10:08.847 に答える
0

もう少しグーグルで調べた後、RE2 ライブラリhttp://code.google.com/p/re2/を見つけました- これはバックグラウンドで正しい理論を備えた高速な実装 (grep または awk に匹敵する速度) であると述べていますメモリ制限を提供できます。RE2::FindAndConsume は適切な API のようです。

編集:いいえ(再び)。FindAndConsume は 1 つの文字列で増分一致のみを検索しますが、データ ストリームの複数のチャンクを渡すことはできません :( ちなみに、一致が見つかった場合、マシンは実際に一致が開始された場所を確認するために戻ってきます (ただし、これはそれほど大きなものではありません)。たとえば、 lexertlが行うように、前方検索中にそれを行うべきではないため、問題です。

于 2013-01-18T22:15:30.407 に答える