【问题标题】:Regex with limiting quantifier does not work in g++ (Ubuntu)带有限制量词的正则表达式在 g++(Ubuntu)中不起作用
【发布时间】:2015-09-28 11:28:04
【问题描述】:

出于某种原因,我必须在 Ubuntu 14.04 g++(版本 4.8.4)中使用 POSIX 的 regex.h
但是,似乎正则表达式在这种环境下不起作用

#include <iostream>
#include <regex.h> 

using namespace std;

int main()
{
    regex_t regex;

    int result = regcomp(&regex, "RESERVE [A-Z][a-z]*[A-Z][a-z]* [0-9]{7}", 0);    
    if(result){
        cout<<"ERROR"<<endl;
    }


    result = regexec(&regex, "RESERVE MrKim 1111111", 0, NULL, 0);
    if(!result){
        cout<<"MATCH"<<endl;
    }
    else if(result == REG_NOMATCH){
        cout<<"NO MATCH"<<endl;
    }
    else{
        char msg[100];
        regerror(result, &regex, msg, 100);
        cout<<msg<<endl;
    }

}

上面的程序只打印“NO MATCH”...
请给我一个建议。

【问题讨论】:

  • 使用REG_EXTENDED。
  • 不,我怀疑它是重复的,它不是 C++,而是 C。
  • 这是cpp代码,但由于兼容性,我不能使用c++11标准库&lt;regex&gt;。
  • @stribizhev 谢谢。效果很好。
  • @stribizhev:将其发布为答案,或许可以描述它解决问题的原因。

标签: c++ regex g++


【解决方案1】:

您遇到的问题是您的正则表达式是用 POSIX ERE 样式编写的(限制量词写为{7})。

为确保您的正则表达式正常工作,您需要可以使用 REG_EXTENDED 标志启用的 ERE 正则表达式类型。

BRE 正则表达式类型支持限制量词(您的正则表达式中有一个 {7}),但您需要转义它们:\{7\}。

请参阅IDEONE demo 以及POSIX Basic Regular Expressions 上有关 POSIX BRE/ERE 区别的更多详细信息。

【讨论】:

  • 圆括号也是如此,在 BRE 中,它们需要转义才能定义分组。 Unescape 圆括号匹配 BRE 正则表达式中的文字括号。
猜你喜欢
  • 2017-07-05
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2018-07-29
  • 2019-02-09
相关资源
最近更新 更多