如何在C++正则表达式中匹配换行符?

12

我尝试了以下正则表达式:

const static char * regex_string = "([a-zA-Z0-9]+).*";

void find_first(const std::string str);

int main(int argc, char ** argv)
{
        find_first("0s7fg9078dfg09d78fg097dsfg7sdg\r\nfdfgdfg");
}
void find_first(const std::string str)
{
        std::cout << str << std::endl;
        std::regex rgx(regex_string);
        std::smatch matcher;
        if(std::regex_match(str, matcher, rgx))
        {
                std::cout << "Found : " << matcher.str(0) << std::endl;
        } else {
                std::cout << "Not found" << std::endl;
        }
}

演示

我本来期望正则表达式完全正确并且可以找到组。但它没有。为什么?如何在C++正则表达式中匹配换行符?在Java中它很好用。


如果我没记错的话,在正则表达式中是 $ - πάντα ῥεῖ
1
你尝试过使用(.|\r\n)*来匹配,而不是使用.*吗? - Zereges
2
使用默认设置,似乎 boost::regex 在使用 '.' 时匹配 '\r'(除非使用 match_not_dot_newline),但 std::regex 不会。到目前为止,我还没有看到在 std 中打开此行为的可能性。 - gast128
3个回答

12

正则表达式中的点号通常匹配除了换行符以外的任何字符,使用std::ECMAScript语法

.   非换行符   匹配除换行符(LF、CR、LS、PS)之外的任何字符。

0s7fg9078dfg09d78fg097dsfg7sdg\r\nfdfgdfg
[a-zA-Z0-9]+ matches until \r ↑___↑ .* would match from here

在许多正则表达式语言中,有一个dotall标志可用于使点号(.)也匹配换行符。

如果没有,不同语言中有一些解决方法,例如使用[^]表示非空[\S\s]表示任何空格或非空格的组合,结果是匹配任何字符,包括\n

regex_string = "([a-zA-Z0-9]+)[\\S\\s]*";

或者使用可选的换行符:([a-zA-Z0-9]+).*(?:\\r?\\n.*)* 或者 ([a-zA-Z0-9]+)(?:.|\\r?\\n)*

查看您的更新演示


更新 - 值得一提的另一个想法:std::regex :: extended

('.')在方括号表达式外使用时,是一个 ERE,应匹配支持的字符集中除 NUL 之外的任何字符。

std::regex rgx(regex_string, std::regex::extended);

在 tio.run 上查看此演示


1
在许多正则表达式引擎中,有一个dotall标志可用于使点号也匹配换行符。这是关于C ++的问题,如果答案提到C ++中是否有/s修饰符会很有帮助。 - Pavel P
@PavelP 对的,我这样写是因为我在 C++ 中找不到任何 dotall flag。如果有人知道在 C++ 中是否存在 dotall flag 以及如何使用它,请评论、编辑或提供新答案。 - bobble bubble
顺便提一下,使用std::regex::extended会使懒惰量词无法使用。 - mojmir

5

你可以尝试使用const static char * regex_string = "((.|\r\n)*)";

希望这可以帮到你。


1
你需要将 '' 字符转义。 - Sopel
1
使用 \ 代替 \ 字符。 - Rajib Chy
2
或者使用原始字符串 R"(((.|\r\n)*))" - Broxzier

1

我正在使用 CTest 和 PROPERTIES PASS_REGULAR_EXPRESSION。

[\S\s]* 没有起作用,但 (.|\r|\n)* 起了作用。

这个正则表达式:

Function registered for ID 2 was called(.|\r|\n)*PASS

匹配项:

Running test function: RegisterThreeDiffItemsTest04
ID 2 registered for callback
ID 4 registered for callback
ID 11 registered for callback
Function registered for ID 2 was called
ID 2 callback deregistered
ID 4 callback deregistered
ID 11 callback deregistered
Setup: PASS

注意:CMakeLists.txt 文件中需要转义反斜杠:
SET (ANDPASS "(.|\\r|\\n)*PASS")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接