【问题标题】:Prevent interpretation of special characters in std::regex防止解释 std::regex 中的特殊字符
【发布时间】:2014-12-03 18:13:12
【问题描述】:

我有以下用 C++11 编写的函数,它使用标准 regex 模块中的正则表达式。顾名思义,它确定给定字符串str 是否是一个以给定prefix 为前缀的数字。

bool isPrefixedNumber(const std::string &prefix, const std::string &str) {
    std::regex re(prefix + "[[:digit:]]+"))
    return std::regex_match(str, re);
}

问题是我希望 prefix 按字面意思理解,即我想要

isPrefixedNumber("t.st", "tXst123")

返回false。有没有一种方法可以构建这样的正则表达式,而无需手动转义prefix 中出现的所有特殊字符?换句话说,在将std::string 传递给std::regex 时如何防止对特殊字符的解释?

注意:上面的函数只是我的问题的一个简单说明。我需要防止在更大的正则表达式中解释字符串。我不需要另一种方法来重写没有正则表达式的函数。

【问题讨论】:

    标签: c++ regex c++11


    【解决方案1】:

    str.find(prefix) == 0str.find_first_not_of("0123456789", prefix.size()) != std::string::npos 是你想要的两个东西。

    只要您有匹配的要求,请考虑正则表达式实际上是一个在运行时解析和执行的程序。将此与编写几行 C++ 代码形成对比,然后再决定哪个更好,但不要从一开始就瞄准正则表达式。

    【讨论】:

    • 是的——看起来这可能是一个 X/Y 问题。
    • 我完全同意你的观点,对于 this 特定示例来说,这是一种更好的方法。但是,我需要防止在更大的正则表达式中解释字符串。我只是想出了这个简单的例子来说明我的问题。我将更新问题以包含这一事实。
    • 好的。尽管如此,当你说“不解释”时,它意味着逐字使用,因此是简单的字符串匹配,你至少应该考虑简单的搜索。也就是说,查看stackoverflow.com/questions/1252992/…,它似乎回答了你的问题。
    • 我有点希望有一种内置的方式来做这件事,所以我不必手动做。无论如何,谢谢!
    • 为 Boost 提交功能请求,这确实是一种相当普遍的需求,而且很容易出错(例如,通过忘记许多特殊字符之一)。
    【解决方案2】:

    我可能只是将这两个部分分别匹配,沿着这条一般路线:

    std::string::size_type pos;
    
    std::regex re(prefix + "[[:digit:]]+"));
    
    return ((pos = str.find(prefix)) != std::string::npos) 
         && std::regex_match(str.substr(pos+prefix.size()), re));
    

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 2019-08-09
      • 2016-06-11
      • 2016-08-29
      相关资源
      最近更新 更多