使用GNU C正则表达式库的字符串的正则表达式

gog*_*idi 4 c regex gnu

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

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

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

我写了以下代码,但它不匹配.

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

我需要写什么?

示例:匹配:

state:q0
state:q0
state:q0s

不匹配:

#state:q0
state q0 #state
:q0

谢谢!

Gre*_*con 7

您的问题中的模式正在使用statewith中的第一个字母[^#],这使得匹配无法继续,因为它尝试匹配tate模式\(state\).

你传递了这个标志REG_EXTENDED,这意味着你不要逃避捕获括号,但要逃避字面括号.

正则表达式,说你什么想要匹配:

^[ \\t]*(state)[ \\t]*:.*$
Run Code Online (Sandbox Code Playgroud)

如在

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

state : q0: match (PASS)
state: q0: match (PASS)
state:q0s: match (PASS)
#state :q0: no match (PASS)
state q0: no match (PASS)
# state :q0: no match (PASS)