我正在编写一个与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
谢谢!
您的问题中的模式正在使用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)