4

GNU C 正規表現ライブラリで使用する正規表現を作成しています。

文字列の形式は次のとおりです: (イタリック体のテキストはコンテンツの説明です)

(NOT a #) start (おそらく空白) : データ

次のコードを書きましたが、一致しません。

regcomp(&start_state, "^[^#][ \\t]*\\(start\\)[ \\t]*[:].*$", REG_EXTENDED);

何を書く必要がありますか?

例: 一致する:

状態: q0
状態: q0
状態: q0s

一致しない:

#状態: q0
状態q0
#状態:q0

ありがとう!

4

3 に答える 3

8

state質問のパターンはwithの最初の文字を消費していたため、 patternとの[^#]照合を試みるため、照合を続行できませんでした。tate\(state\)

フラグREG_EXTENDEDを渡しました。つまり、括弧のキャプチャはエスケープしませんが、リテラルの括弧はエスケープします。

正規表現を使用して、一致させたいものを言います。

^[ \\t]*(state)[ \\t]*:.*$

のように

#include <stdio.h>
#include <regex.h>

int main(int argc, char **argv)
{
  struct {
    const char *input;
    int expect;
  } tests[] = {
    /* should match */
    { "state : q0", 1 },
    { "state: q0",  1 },
    { "state:q0s",  1 },

    /* should not match */
    { "#state :q0",  0 },
    { "state q0",    0 },
    { "# state :q0", 0 },
  };
  int i;
  regex_t start_state;
  const char *pattern = "^[ \\t]*(state)[ \\t]*:.*$";

  if (regcomp(&start_state, pattern, REG_EXTENDED)) {
    fprintf(stderr, "%s: bad pattern: '%s'\n", argv[0], pattern);
    return 1;
  }

  for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
    int status = regexec(&start_state, tests[i].input, 0, NULL, 0);

    printf("%s: %s (%s)\n", tests[i].input,
                            status == 0 ? "match" : "no match",
                            !status == !!tests[i].expect
                              ? "PASS" : "FAIL");
  }

  regfree(&start_state);

  return 0;
}

出力:

状態 : q0: 一致 (PASS)
状態: q0: 一致 (PASS)
状態:q0s: 一致 (合格)
#state :q0: 一致なし (PASS)
状態 q0: 不一致 (PASS)
# 状態 :q0: 一致なし (PASS)
于 2010-02-04T18:28:04.350 に答える
1

わかりました、私はそれを理解しました:

regcomp(&start_state, "^[^#]*[ \\t]*start[ \\t]*:.*$", REG_EXTENDED);

上記は私の問題を解決します!(結局、[^#] の後に * を付けるのを忘れていました)...

とにかく助けてくれてありがとう、ルーベンス!:)

于 2010-02-04T18:07:52.260 に答える
0

これは、サンプル データで機能します。

^[^#]\s*\w+\s*:(?<data>.*?)$

編集:わかりませんが、最初^と最後$はその設定で異なる動作をするため、複数行のサポートを有効にする必要があります。

于 2010-02-04T17:41:06.787 に答える