我在使用正则表达式和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);
}
}
我也想知道'[[]]'和'[]'之间有什么不同
答案 0 :(得分:0)
您确认某些字符串以CR结尾(回车)。由于regex_match
需要完整的字符串匹配,因此正则表达式无法正常工作,因为它们与traling CR符号不匹配。
作为一种变通方法,您可以在模式的末尾添加一个可选的\r?
:
char rx[]={"([[:alpha:]][^[:digit:]_][[:digit:]])\r?"};
?
修饰符匹配量化子模式的1或0次出现。