使美元和插入符号仅匹配字符串的 beginning/end,而不匹配 before/after 嵌入的换行符

Make dollar and caret only match at beginning/end of string, not before/after embedded newlines

下面的这段小代码输出

<hello>
<world>

证明 ^$ 也分别匹配 \n 之后和之前。我怎样才能改变这种行为,让它们只匹配字符串的开头和结尾? (在这种情况下,示例 str 输入中将没有匹配项。)

#include <boost/regex.hpp>
#include <iostream>
int main() {
    std::string tokenRegex = "^[^\n\r]+$";
    std::string str = "hello\nworld";
    boost::sregex_iterator rit{std::begin(str), std::end(str), boost::regex{tokenRegex}};
    boost::sregex_iterator end;

    while (rit != end) {
        std::cout << '<' << rit->str() << '>' << '\n';
        ++rit;
    }
}

您需要使用 match_single_line flag:

boost::sregex_iterator rit{
    std::begin(str),
    std::end(str),
    boost::regex{tokenRegex},
    boost::match_single_line // <-- here
};

这是一个匹配标志 - 您在匹配(或构造匹配的迭代器)时指定它,而不是在编译正则表达式时指定它。