CPP 中的正则表达式问题

Issues with regex in CPP

本文关键字:问题 正则表达式 CPP      更新时间:2023-10-16

我在正则表达式和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 MATCHnn"; 
else 
    cout<<"REGEX not MATCHnn";
} catch (std::regex_error& e) {
        cerr<<e.code()<<'t';
        cerr<<e.what()<<"nn";
}
return true;
}

这是"remove_beginning_whites"功能:

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

我还想知道"[[ ]]"和"[ ]"之间有什么区别

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

作为解决方法,您只需在模式末尾添加一个可选r?

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

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