2010-02-04 178 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