C++ 正则表达式捕获正在删除电子邮件验证器中的最后一个字符
C++ regex capture is dropping last char in email validator
C++ Shell 联机执行 Link: 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;
}
Output:
Local : loca
Domain : domain.com
Valid Email ID:
local@domain.com
Local : local.constan
Domain : domain.com
Valid Email
ID: local.constant@domain.com
Local : local+addo
Domain : domain.com
Valid Email ID:
local+addon@domain.com
Local : local.constant+addo
Domain : domain.com
Valid
Email ID: local.constant+addon@domain.com
Invalid Email ID: local@domain.c.o.m
请注意,在局部变量中,我的正则表达式组捕获是如何删除最后一个字符的。
问题:
- 如何分组捕获直到“+”号
- 如何使群组捕获不丢失最后一个字符?
您可以使用这个表达式:
"([\w.]+)(?:\+[\w]+)*\@([\w]+\.[\w]+)$"
第一部分([\w.]+)
匹配本地部分(即任何单词字符或点)
第二部分 (?:\+[\w]+)*
表示一个 non-capturing 组重复 0 次或多次(匹配一个加号后跟一个或多个单词字符)。
第三部分\@
匹配@字符。
最后一部分 ([\w]+\.[\w]+)
匹配域部分(即用一个点分隔的两个单词),您答对了。
C++ Shell 联机执行 Link: 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;
}
Output:
Local : loca
Domain : domain.com
Valid Email ID: local@domain.comLocal : local.constan
Domain : domain.com
Valid Email ID: local.constant@domain.comLocal : local+addo
Domain : domain.com
Valid Email ID: local+addon@domain.comLocal : local.constant+addo
Domain : domain.com
Valid Email ID: local.constant+addon@domain.comInvalid Email ID: local@domain.c.o.m
请注意,在局部变量中,我的正则表达式组捕获是如何删除最后一个字符的。
问题:
- 如何分组捕获直到“+”号
- 如何使群组捕获不丢失最后一个字符?
您可以使用这个表达式:
"([\w.]+)(?:\+[\w]+)*\@([\w]+\.[\w]+)$"
第一部分([\w.]+)
匹配本地部分(即任何单词字符或点)
第二部分 (?:\+[\w]+)*
表示一个 non-capturing 组重复 0 次或多次(匹配一个加号后跟一个或多个单词字符)。
第三部分\@
匹配@字符。
最后一部分 ([\w]+\.[\w]+)
匹配域部分(即用一个点分隔的两个单词),您答对了。