2010-02-04 126 views
4

字符串我写一个正则表达式与GNU C正则表达式库使用:正则表达式使用GNU C正则表达式库

字符串的形式为:(斜体文字的内容的说明)

(不是#)开始(也许空格)

我写了下面的代码数据,但它不会匹配。

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

我需要写什么?

例子: 匹配:

状态 : Q0
状态: Q0
状态:q0s

不匹配:

#state:Q0
状态Q0
#状态 :Q0

谢谢!

+2

可以请你发布一些具体的例子? – 2010-02-04 17:37:37

回答

7

在你的问题的模式是消费在state的第一个字母与[^#],这在离开比赛无法继续,因为它试图匹配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; 
} 

输出:

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)
+1

非常彻底!非常感谢你:) – gogodidi 2010-02-04 20:34:56

+0

不客气!我很高兴它有帮助。 – 2010-02-04 21:04:14

0

这与您的样本数据:

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

编辑:我不知道,但你需要启用多行支持,作为第一^和最后$有一个不同的行为设置。

1

好吧,我想通了:上面

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

解决我的问题! (事实证明,我忘了在[^#]之后放一个*)...

无论如何,感谢您的帮助,鲁本斯! :)

+3

你想要对冒号左侧的内容有多严格?例如,该模式也允许“foobarbazstart:xyz”匹配。 – 2010-02-04 18:35:14

相关问题