Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用GNU C正则表达式库的字符串正则表达式_C_Regex_Gnu - Fatal编程技术网

使用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)[

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

字符串的形式如下:(斜体文本是对内容的描述)

(不是一个开始(可能是空白):数据

我已经编写了以下代码,但不匹配

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”匹配。非常彻底!非常感谢:)