目标:
'\n\n',
'\r\n\r\n', '\r\n\n', '\n\r\n'
问题:
我不认为我目前用于查找'\n\n'
的正则表达式是正确的。这是我第一次真正使用正则表达式而不是在命令行中删除文件时使用*。
是否可以在一个正则表达式中检查所有这些情况(如上所列)?或者我必须对compile_regex进行4次单独调用吗?
代码:
int checkForBlankLine(char *reader) {
regex_t r;
compile_regex(&r, "*\n\n");
match_regex(&r, reader);
return 0;
}
void compile_regex(regex_t *r, char *matchText) {
int status;
regcomp(r, matchText, 0);
}
int match_regex(regex_t *r, char *reader) {
regmatch_t match[1];
int nomatch = regexec(r, reader, 1, match, 0);
if (nomatch) {
printf("No matches.\n");
} else {
printf("MATCH!\n");
}
return 0;
}
备注:
我只需要担心找到一个空行,这就是为什么我的regmatch_t match[1]
只有一个项目
reader是包含我正在检查空白行的文本的char数组。
我已经看过其他示例,并试图将代码基于这些示例,但我似乎仍然遗漏了一些东西。
谢谢你的帮助/建议。
如果有任何需要澄清的地方,请告诉我。
答案 0 :(得分:2)
似乎你必须将正则表达式编译为扩展名:
regcomp(&re, "\r?\n\r?\n", REG_EXTENDED);
第一个原子\r?
可能是不必要的,因为如果你没有捕获结果,它就不会添加到空行条件。
在上面,空白行真的意味着空行。如果您希望空行表示除空格之外没有字符的行,您可以使用:
regcomp(&re, "\r?\n[ \t]*\r?\n", REG_EXTENDED);
(我认为你不能在这里使用空格字符模式\s
而不是[ \t]
,因为这将包括回车和换行。)
正如其他人已经暗示的那样,“在命令行中简单使用*
不是正则表达式。这种通配符匹配称为文件通配符,具有不同的语义。
答案 1 :(得分:1)
检查正则表达式中*
的含义。它不像命令行中的通配符“任何东西”。 *
表示前一个组件可以出现任意次数。正则表达式中的通配符是.
。因此,如果您想说match anything
,您可以执行.*
,这可能是任何次数。
因此,在您的情况下,您可以.*\n\n.*
执行与\n\n
任何内容匹配的or
。
最后,您可以在正则表达式中使用( )
,并使用.*(\n\n|\r\n\r\n).*
对内容进行分组。因此,您可以执行类似\n\n
的操作,并且可以匹配任何包含\r\n\r\n
或{{1}}的内容。
希望有所帮助。
答案 2 :(得分:0)
不是只查找\r
或\n
,而是查找不 \r
或\n
?
你的正则表达式只是
'[^\r\n]'
且匹配结果为false表示符合您规范的空白行。