使用GNU C正则表达式库的字符串正则表达式
我正在编写一个用于GNU C正则表达式库的正则表达式: 字符串的形式如下:(斜体文本是对内容的描述) (不是一个开始(可能是空白):数据 我已经编写了以下代码,但不匹配使用GNU C正则表达式库的字符串正则表达式,c,regex,gnu,C,Regex,Gnu,我正在编写一个用于GNU C正则表达式库的正则表达式: 字符串的形式如下:(斜体文本是对内容的描述) (不是一个开始(可能是空白):数据 我已经编写了以下代码,但不匹配 regcomp(&start_state, "^[^#][ \\t]*\\(start\\)[ \\t]*[:].*$", REG_EXTENDED); 我需要写什么 示例: 要匹配: ^[ \\t]*(state)[ \\t]*:.*$ 状态:q0 状态:q0 州:q0s 不匹配: ^[ \\t]*(state)[
regcomp(&start_state, "^[^#][ \\t]*\\(start\\)[ \\t]*[:].*$", REG_EXTENDED);
我需要写什么
示例:
要匹配:
^[ \\t]*(state)[ \\t]*:.*$
状态:q0状态:q0
州:q0s 不匹配:
^[ \\t]*(state)[ \\t]*:.*$
#状态:q0状态q0
#州:q0
谢谢 这适用于您的示例数据:
^[^#]\s*\w+\s*:(?<data>.*?)$
^[^#]\s*\w+\s*:(?*?)$
编辑:我不知道,但您需要启用多行支持,因为第一个^
和最后一个$
在该设置中有不同的行为。好的,我想出来了:
regcomp(&start_state, "^[^#]*[ \\t]*start[ \\t]*:.*$", REG_EXTENDED);
以上解决了我的问题!(结果,我忘了在[^#]后面加*了)
无论如何,谢谢你的帮助,鲁本斯!:) 您问题中的模式使用了
状态中的第一个字母和[^#]
,这使得匹配无法继续,因为它试图将tate
与模式\(状态\)
匹配
您传递了标志REG_EXTENDED
,这意味着您不会转义捕获括号,而是转义文字括号
使用正则表达式,说出您想要匹配的内容:
^[ \\t]*(state)[ \\t]*:.*$
如
#包括
#包括
int main(int argc,字符**argv)
{
结构{
常量字符*输入;
int expect;
}测试[]={
/*应该匹配*/
{“状态:q0”,1},
{“状态:q0”,1},
{“状态:q0s”,1},
/*不应该匹配*/
{“#state:q0”,0},
{“状态q0”,0},
{“#state:q0”,0},
};
int i;
regex\u t start\u状态;
常量字符*模式=“^[\\t]*(状态)[\\t]*:.*$”;
if(regcomp(&start_状态、模式、注册扩展)){
fprintf(stderr,“%s:错误模式:“%s”\n”,argv[0],模式);
返回1;
}
对于(i=0;i
输出:
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)
状态:q0:匹配(通过)
状态:q0:匹配(通过)
状态:q0s:匹配(通过)
#状态:q0:不匹配(通过)
状态q0:不匹配(通过)
#状态:q0:不匹配(通过)你能发布一些具体的例子吗?你想对冒号左边的内容有多严格?例如,该模式还允许“foobarbazstart:xyz”匹配。非常彻底!非常感谢:)