CPP中的正则表达式问题

时间:2017-01-12 15:20:39

标签: c++ regex

我在使用正则表达式和C ++时遇到了一些问题。 我的问题是,使用相同的表达式,一些应该匹配的字符串不会。

RX: ([[:alpha:]][^[:digit:]|_][[:digit:]])
INPUT: a&3
REGEX not MATCH

RX: ([[:alpha:]][^[:digit:]|_][[:digit:]])
INPUT: u#5
REGEX not MATCH

RX: ([[:alpha:]][^[:digit:]|_][[:digit:]])
INPUT: o@9
REGEX MATCH

有人能解释我的错误吗?

我使用的代码是:

bool parse(string &in){
string st;
try{
st = remove_beginning_whites(in);
}catch (const std::invalid_argument& e) {
    return false;
}

//if (st!="")   cout << st;
try{
    char rx[]={"([[:alpha:]][^[:digit:]|_][[:digit:]])"};

    cout << "RX: "<< rx<<'\n'<<"INPUT: "<<in<<"\n";
    regex my_RX (rx);

if (regex_match(in,my_RX)) 
    cout<<"REGEX MATCH\n\n"; 
else 
    cout<<"REGEX not MATCH\n\n";

} catch (std::regex_error& e) {
        cerr<<e.code()<<'\t';
        cerr<<e.what()<<"\n\n";

}
return true;

}

这是'remove_beginning_whites'功能:

string remove_beginning_whites(string& in){
auto pos = in.find_first_not_of(" \n\r\t");

if(pos==string::npos) {
                        throw std::invalid_argument("empty string");
                        }
else                {
                    return in.substr(pos);
                    }
}

我也想知道'[[]]'和'[]'之间有什么不同

1 个答案:

答案 0 :(得分:0)

您确认某些字符串以CR结尾(回车)。由于regex_match需要完整的字符串匹配,因此正则表达式无法正常工作,因为它们与traling CR符号不匹配。

作为一种变通方法,您可以在模式的末尾添加一个可选的\r?

char rx[]={"([[:alpha:]][^[:digit:]_][[:digit:]])\r?"};

?修饰符匹配量化子模式的1或0次出现。