【问题标题】:How can I match the \0 character in a regex in C++?如何匹配 C++ 正则表达式中的 \0 字符?
【发布时间】:2013-02-18 03:00:24
【问题描述】:

我需要将文本“\0”与匹配“a”或“b”的正则表达式匹配。 (C++ 中字符常量的正则表达式)。我尝试了一堆不同的正则表达式,但还没有一个成功的。我最近的尝试:

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

我尝试过的大多数其他事情都出现了段错误,所以这确实是我得到的最接近的。

【问题讨论】:

  • 你用的是什么编译器?
  • 为什么需要匹配呢? \0null terminator 所以它真的不是字符串的一部分,找到它是微不足道的。
  • 这是一个作业,我们正在创建一个语言翻译器,我们需要做的一件事是将空终止符作为字符常量进行测试。我正式感兴趣为什么我的教授认为这是语言的必要部分,但他确实..
  • 那么您不是在解析的字符串中寻找空终止符;您正在寻找字符形式的转义零。即\\ 后跟0
  • 跟进,如果你还在看:see it live.

标签: c++ regex


【解决方案1】:

这与我测试过的('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

【讨论】:

    【解决方案2】:

    '\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' 就不会得到特殊处理。当然,除非您使用特殊处理的函数复制内容。

    【讨论】:

      【解决方案3】:

      有效的正则表达式(在本例中,使用 C 标头)是:

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

      感谢@WhozCraig 的帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-24
        相关资源
        最近更新 更多