使美元和插入符号仅匹配字符串的 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
};
这是一个匹配标志 - 您在匹配(或构造匹配的迭代器)时指定它,而不是在编译正则表达式时指定它。
下面的这段小代码输出
<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
};
这是一个匹配标志 - 您在匹配(或构造匹配的迭代器)时指定它,而不是在编译正则表达式时指定它。