c++ - C++ 正则表达式捕获正在删除电子邮件验证器中的最后一个字符
问题描述
C++ Shell 在线执行链接:http ://cpp.sh/5z2uq
我正在编写一个正则表达式来验证一个电子邮件 ID,该电子邮件 ID 在其本地名称中可以有多个点和加号字符,并且在域名中只能有一个点。
我现在面临的问题是在捕获组中。我的域名捕获,即第 2 组按预期工作,如输出所示。但是,当我尝试捕获本地名称,即组 #1 时,
它不应该捕获任何超过 '+' 符号但不包括 '+' 的内容,并且在捕获本地名称后,输出缺少最后一个字符。
请看一下我的 C++ 正则表达式代码:
#include <iostream>
#include <regex>
using namespace std;
int main()
{
string str;
vector<string> emails = {
"local@domain.com",
"local.constant@domain.com",
"local+addon@domain.com",
"local.constant+addon@domain.com",
"local@domain.c.o.m"
};
for(auto ele : emails)
{
str = ele;
regex e("([\\w+\\.]+)\\+*[\\+\\w]+\\@([\\w]+\\.[\\w]+)$");
smatch parts;
bool match = regex_match(str,parts,e);
if(match==true)
{
cout << "Local : " << parts.str(1) << endl;
cout << "Domain : " << parts.str(2) << endl;
cout << "Valid Email ID: " << ele << endl << endl;
}
else
{
cout << "Invalid Email ID: " << ele << endl << endl;
}
}
return 0;
}
输出:
本地:loca
域:domain.com
有效电子邮件 ID:local@domain.com本地:local.constan
域:domain.com
有效电子邮件 ID:local.constant@domain.com本地:local+addo
域:domain.com
有效电子邮件 ID:local+addon@domain.com本地:local.constant+addo
域:domain.com
有效电子邮件 ID:local.constant+addon@domain.com无效的电子邮件 ID:local@domain.com
请注意,在局部变量中,我的正则表达式组捕获如何删除最后一个字符。
问题:
- 如何分组捕获直到“+”号
- 如何使组捕获不丢弃最后一个字符?
解决方案
你可以使用这个表达式:
"([\\w.]+)(?:\\+[\\w]+)*\\@([\\w]+\\.[\\w]+)$"
第一部分([\\w.]+)
匹配本地部分(即任何单词字符或点)
第二部分(?:\\+[\\w]+)*
表示重复 0 次或更多次的非捕获组(匹配一个或多个单词字符后跟的加号)。
第三部分\\@
匹配@ 字符。
最后一部分([\\w]+\\.[\\w]+)
匹配域部分(即用一个点分隔的两个单词),你做对了。
推荐阅读
- angular - 所选选项的角度显示值
- r - 找到具有最大乘积的相邻元素对
- python - 在 pandas、scipy 和 numpy 中,MAD 结果不同
- angular - TS1086:无法在环境上下文中声明访问器
- powershell - 为什么 PowerShell 会抛出错误“术语 'My.App' 未被识别为 cmdlet 的名称”
- android - 配备 Android 10 的三星 Galaxy S10e:显示键盘时应用程序崩溃
- node.js - 如何从多部分表单数据中获取 Node JS 中间件中的请求正文?
- reactjs - 使用 react-sortable-hoc 拖动时会丢失 tr 元素的样式
- python-3.x - 使用 sudo 运行 python 脚本时,我收到模块“boto3”没有属性“客户端”错误
- wso2 - WSO2IS 5.9 用户存储列表