2013-03-04 30 views
2

我需要将文本'\ 0'与匹配'a'或'b'的相同正则表达式匹配。 (C++中的字符常量的正则表达式)。我试过了一堆不同的正则表达式,但还没有成功。我的最新尝试:如何在C++中匹配正则表达式中的 0字符?

^['].|\\0['] 

大多数我试过其他的东西给赛格故障,所以这是真的我已经得到最接近的一次。

+0

你使用什么编译器? – 2013-03-04 04:24:12

+1

为什么你需要匹配它? '\ 0'是[null terminator](https://en.wikipedia.org/wiki/Null_character),所以它确实不是字符串的一部分,并且发现它很简单。 – congusbongus 2013-03-04 04:24:46

+0

g ++我也在使用“regex.h”包 – arc 2013-03-04 04:24:59

回答

0

这与我测试过的('a','b','\ 0')非常吻合。

如果您没有std::regexboost::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'; 
     } 
    } 
} 

Example

0

没有什么神奇的约'\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'就没有得到特殊待遇。当然,除了用专门处理它的功能来复制内容。

0

的作品(在这种情况下,使用C头)的正则表达式是:

^('(.|([\\]0))') 

感谢@WhozCraig的帮助!