【问题标题】:Is this a bug of boost regex?这是提升正则表达式的错误吗?
【发布时间】:2014-08-25 02:30:19
【问题描述】:

我想匹配任何字符,如 a-z、A-Z、0-9 和 -,所以我写了这个:

#include "thirdparty/boost/regex.hpp"
#include <iostream>


using namespace std;

int main(){
    string reg = "[a-z-A-Z0-9]";
    boost::regex expression(reg);
    cout<<"OK"<<endl;
}

运行时,程序核心转储并说:

在抛出 'boost::exception_detail::clone_impl >' 的实例后调用终止 what(): Invalid range end in character class 解析正则表达式时出错:'[a-z->>>HERE>>>A-Z0-9]'。

谁能告诉我为什么?

【问题讨论】:

  • 您是否在其他任何东西(例如您的文本编辑器)中尝试过这个正则表达式?

标签: c++ regex boost


【解决方案1】:

造成这种情况的原因是字符类中第一个范围之后的连字符 (-)。在字符类中,连字符具有特殊 含义。您可以将连字符作为类的第一个或最后一个字符。

[-a-zA-Z0-9]
[a-zA-Z0-9-]

在一些正则表达式实现中,您也可以直接放在范围之后。

如果您将连字符放在其他任何地方,您需要对其进行转义才能将其添加到您的类中。

实际正则表达式实现:

[a-z\-A-Z0-9]

作为字符串文字:

string reg = "[a-z\\-A-Z0-9]";

【讨论】:

  • 我发现 [-a-zA-Z0-9],[a-zA-Z0-9-] 或 [a-z\-A-Z0-9] 除了 [a-z-A-Z0] -9]。 [a-z-A-Z0-9] 在 perl 和 python 中工作,boost regex 声称它采用与 perl 相同的语法,但也许这有点不同。
  • +1,但只需一个反斜杠即可转义连字符。当您以 C 字符串文字的形式编写正则表达式时,第二个反斜杠变得必要。如果你用两个反斜杠写它,你也应该包括引号。更好的是,两种方式都写——实际的正则表达式:[a-z\-A-Z0-9];作为字符串文字:"[a-z\\-A-Z0-9]".
猜你喜欢
  • 2011-07-29
  • 2017-01-26
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 2023-03-15
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多