4

我正在编写一个与 GNU C 正则表达式库一起使用的正则表达式:

该字符串的形式为:(斜体文本是对内容的描述)

(不是#)开始(可能是空格):数据

我已经编写了以下代码,但它不匹配。

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

我需要写什么?

示例:匹配:

状态:q0
状态:q0
状态:q0s

不匹配:

#state :q0
状态 q0 #state :
q0

谢谢!

4

3 回答 3

8

您问题中的模式正在消耗statewith中的第一个字母[^#],这导致匹配无法继续,因为它试图匹配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:匹配(通过)
状态:q0:匹配(通过)
状态:q0s:匹配(通过)
#state :q0: 不匹配(通过)
状态 q0:不匹配 (PASS)
# state :q0: no match (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 回答