C++ 用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
(?=[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