簡體   English   中英

使用GNU C正則表達式庫的字符串的正則表達式

[英]Regex for string using GNU C regex library

我正在編寫一個與GNU C正則表達式庫一起使用的正則表達式:

該字符串的格式為:(斜體文本是內容的描述)

(不是#)開始(可能是空格) :數據

我寫了以下代碼,但它不匹配。

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

我需要寫什么?

示例:匹配:

州:q0
州:q0
狀態:q0s

不匹配:

#state:q0
國家q0
#state:q0

謝謝!

你問題中的模式是消耗了[^#] 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)

好的,我弄清楚了:

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

上面解決了我的問題! (事實證明,我忘了在[^#]之后放一個*)...

無論如何,謝謝你的幫助,魯本斯! :)

這適用於您的示例數據:

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

編輯 :我不知道,但你需要啟用多行支持,因為第一個^和最后一個$與該設置有不同的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM