C++ 用C+;编写正则表达式的正确方法是什么+;?

C++ 用C+;编写正则表达式的正确方法是什么+;?,c++,regex,C++,Regex,在C语言中很难写出正则表达式下面的代码++ (?=[a-zA-Z])*(?=[\s])?(00|\+)[\s]?[0-9]+[\s]?[0-9]+(?=[\sa-zA-Z])* 字符串示例:“ABC+91 99974745 DEF” 匹配的字符串必须为:“+91 99974745” C++代码: #include <iostream> #include <regex> using namespace std; int main() { string

在C语言中很难写出正则表达式下面的代码++

(?=[a-zA-Z])*(?=[\s])?(00|\+)[\s]?[0-9]+[\s]?[0-9]+(?=[\sa-zA-Z])*
字符串示例:
“ABC+91 99974745 DEF”

匹配的字符串必须为:
“+91 99974745”

C++代码:

#include <iostream> 
#include <regex> 

using namespace std; 
int main() 
{ 
    string a = "ABC + 91 9997474545 DEF"; 
    try
    {
        regex b("(?=[a-zA-Z])*(?=[\\s])?(00|\\+)[\\s]?[0-9]+[\\s]?[0-9]+(?=[\\sa-zA-Z])*"); 

        smatch amatch;
        if ( regex_search(a, amatch, b) )
        {
            for(const auto& aMa : amatch)
            {
                cout<< "match :" <<aMa.str()<<endl;
            }
        }
    }
    catch (const regex_error& err)
    { 
        std::cout << "There was a regex_error caught: " << err.what() << '\n'; 
    }
    return 0; 
}
代码中有什么错误?

编辑:改进版(基于Toto注释):

  • 使用字母字符的[alpha]字符类,而不是\w,它也可以包含数字
  • 在第二个/主组
    (\+?\s*\d++\s*\d+
    中,使用
    +
    强制至少一个数字

让代码更具可读性的两条建议:

  • 使用原始字符串(R)避免双引号
  • 使用字符类,例如\w(表示字母),\s(表示空格),\d(表示数字)
然后您的正则表达式可以简化如下:

regex b(R"((\w*\s*)(\+?\s*\d*\s*\d*)(\s*\w*))");
这将产生结果(假设您希望提取带有可选加号的数字):

注:上面的正则表达式包含3个组:

  • (\w*\s*)-前面的一些字母和空格
  • (+?\s*\d*\s*\d*)-加号,然后是一些数字(91)、一些可选空格和一些其他数字(9997474545)
  • (\s*\w*)-一些空格,然后是一些字母

不应量化零宽度断言。使用
regex b(“(00 | \+)\\s?[0-9]+\\s?[0-9]+(?=[\\sa-zA-Z])”
,请尝试以下操作:
regex b{“[a-zA-Z]*[\\s]((?:00 | \+)[\\s]?[0-9]+[\\s]?[0-9]+(?=[\\sa-zA-zA-Z]*)”)”
\w
代表
[a-zA-Z]-[u9],而不仅仅代表字母。您的正则表达式匹配空字符串。
[alpha]
不是字母字符类,它是一个完全由字符
a
l
p
h
组成的类。也许你的意思是
[:alpha:]
regex b(R"(([alpha]*\s*)(\+?\s*\d+\s*\d+)(\s*[alpha]*))");
regex b(R"((\w*\s*)(\+?\s*\d*\s*\d*)(\s*\w*))");
match :ABC + 91 9997474545 DEF
match :ABC 
match :+ 91 9997474545
match : DEF