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

时间:2010-02-04 17:32:31

标签: c regex gnu

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

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

  

(不是#)启动(可能是空格):数据

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

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

我需要写什么?

例子: 匹配:

  

州:q0
     州:q0
         状态:q0s

不匹配:

  

#state:q0
  国家q0
    #state:q0

谢谢!

3 个答案:

答案 0 :(得分:7)

您的问题中的模式消耗了state中带有[^#]的第一个字母,这使得匹配无法继续,因为它尝试将tate与模式{{1}匹配}。

您传递了标记\(state\),这意味着您不会转义捕获括号,但会删除字面括号。

使用正则表达式,说出想要匹配的内容:

REG_EXTENDED

,如

^[ \\t]*(state)[ \\t]*:.*$

输出:

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 :(得分:1)

好的,我明白了:

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

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

谢谢你的帮助,鲁本斯! :)

答案 2 :(得分:0)

这适用于您的示例数据:

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

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