2

T-Rex正規表現ライブラリを使用して、入力された文字列を次の正規表現に検証しました

(“(([A-PR-UWYZ][A-HK-Y]{0,1}[0-9]{1,2}[ABCEHMNPRTVWXY]{0,1}|GIR)\s{0,2}([0-9][ABD-HJLN-UW-Z]{2}))”)

しかし、"A11AA"渡されるべきそのような文字列は失敗します。私たちを手伝ってくれますか ?

T-Rex のソース コードはhttp://sourceforge.net/projects/tiny-rex/にあります。

4

2 に答える 2

0

原則として、「バグ!」と呼ぶ前に 3 回チェックする必要があります。コンパイラ、ライブラリ、またはその他のツール (開発者はおそらく自分が何をしているかを知っており、自分のものをテストしています)。その上、あなたは人前で恥ずかしい思いをするかもしれません;-)

AFAICS、あなたの「A11AA」文字列は、指定された式と一致しません。その後、さらに何かが必要です。

より単純な式を試して、文字列の一部を一致させて調整してください。式の正確な意味を確認してください (さまざまなツールの言語は腹立たしいほど異なります)。

于 2013-01-20T02:29:55.407 に答える
0

突然の推測:

#include "trex.h"
#include <stdio.h>
#include <string.h>

#ifdef _UNICODE
#define trex_sprintf swprintf
#else
#define trex_sprintf sprintf
#endif

int main(int argc, char* argv[])
{
    const TRexChar *begin,*end;
    TRexChar sTemp[200];
    const TRexChar *error = NULL;
    TRex *x = trex_compile(_TREXC(

  "("
    "("
      "("
        "[A-P]|[R-U]|[WYZ]"
      ")"
      "("
        "[A-H]|[K-Y]"
      ")?"

      "[0-9]{1,2}"

      "([ABCEHMNPRTVWXY]?|GIR)"
     ")"

     "\\s{0,2}"
     "("
       "[0-9]"
       "("
        "[AB]|[D-H]|[JL]|[N-U]|[W-Z]"
       "){2}"
     ")"
   ")"),&error);

    if(x) {
        trex_sprintf(sTemp,_TREXC("A11AA"));
        if(trex_search(x,sTemp,&begin,&end))
        {
            int i,n = trex_getsubexpcount(x);
            TRexMatch match;
            for(i = 0; i < n; i++)
            {
                TRexChar t[200];
                trex_getsubexp(x,i,&match);
                trex_sprintf(t,_TREXC("[%%d]%%.%ds\n"),match.len);
                trex_printf(t,i,match.begin);
            }
            trex_printf(_TREXC("match! %d sub matches\n"),trex_getsubexpcount(x));
        }
        else {
            trex_printf(_TREXC("no match!\n"));
        }
        trex_free(x);
    }
    else {
        trex_printf(_TREXC("compilation error [%s]!\n"),error?error:_TREXC("undefined"));
    }
    return 0;
}
于 2013-01-18T22:57:03.823 に答える