我需要将文本“\0”与匹配“a”或“b”的正则表达式匹配。(C++ 中字符常量的正则表达式)。我尝试了一堆不同的正则表达式,但还没有一个成功的。我最近的尝试:
^['].|\\0[']
我尝试过的大多数其他事情都给出了段错误,所以这确实是我得到的最接近的。
这与我测试过的('a','b','\0')非常有效。
如果你没有,std::regex
或者boost::regex
我猜你能从中得到什么,那就是我使用的正则表达式是('.'|'\\0')
.
#include <boost/regex.hpp>
#include <string>
#include <iostream>
#include <vector>
int main() {
std::vector<std::string> strings;
strings.push_back(R"('a')");
strings.push_back(R"('b')");
strings.push_back(R"('\0')");
boost::regex rgx(R"(('.'|'\\0'))");
boost::smatch match;
for(auto& i : strings) {
if(boost::regex_match(i,match, rgx)) {
boost::ssub_match submatch = match[1];
std::cout << submatch.str() << '\n';
}
}
}
有效的正则表达式(在这种情况下,使用 C 标头)是:
^('(.|([\\]0))')
感谢@WhozCraig 的帮助!
没有什么神奇的'\0'
;它只是一个字符,就像任何其他字符一样,在正则表达式中使用它不需要(几乎)任何特殊操作。您可能遇到的唯一问题是,如果您在传递给将其视为字符串结尾的函数的字符文字中间使用它。为避免这种情况,请将其强制为std::string
:
const char s[] = "a\0b";
std::string not_my_str(s); // not_my_str holds "a"
std::string str(s, 3); // str holds "a\0b"
一旦构建了字符串对象,嵌入的对象'\0'
就不会得到特殊处理。当然,除非您使用特殊处理的功能复制内容。