这是我第一次在C语言中使用regex,我遇到了一些麻烦。我试图复制sed
中使用的语法,即s/findthisstring/replacewiththis/g
必须存在而findthisstring
不存在的replacewiththis
。
我想到的正则表达式是^s/(.*)/(.*)/g$
这是我的密码
int verifyPattern(char *pattern) {
regex_t regex;
int reti = regcomp(®ex, "^s/(.*)/(.*)/g$", 0);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
reti = regexec(®ex, pattern, 0, NULL, 0);
if (!reti) {
puts("Match");
} else if (reti == REG_NOMATCH) {
puts("No match");
} else {
puts("Regex error");
}
return 1;
}
我相信搞错的部分是
.+
。如果我把它换成.*
一切都好。有人知道这方面的工作吗??谢谢!
最佳答案
您忘记传递REG_EXTENDED
标志以允许模式中的$
。另外,regex允许的/.../
节太多。您需要的是匹配除/
和\
之外的转义序列或字符:
int reti = regcomp(®ex, "^s/(\\\\.|[^\\\\/]+)+/(\\\\.|[^\\\\/]+)*/g$", REG_EXTENDED);
查看C demo
基本上,我用匹配转义序列(
.
)或((\\.|[^\\/]+)
)一个或多个字符而不是\\.
和|
的\
模式替换了/
。以下是测试列表:
verifyPattern("s/s/s/g");//Match
verifyPattern("s/s//g");//Match
verifyPattern("s//s/g");//No Match
verifyPattern("s/s\\/s/g");//No match
verifyPattern("s/s\\/s/text/text/text/g"); // No match