【问题标题】:Using regex for email input validation C++ [duplicate]使用正则表达式进行电子邮件输入验证 C++ [重复]
【发布时间】:2019-07-05 17:30:05
【问题描述】:

对于一个项目,我正在尝试使用正则表达式验证我的用户输入电子邮件,但它似乎接受了我输入的任何内容。我知道我可能在做一些愚蠢的事情,因为我是 C++ 新手。对不起大家!希望能帮到你。

用户.cpp 文件

#include "pch.h"
#include "User.h"

//Email regex
std::string userEmailRegex = "[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a- 
z0-9-]+)*(.[a-z]{2,4})";

//Validates data against a user-defined string
bool validate(std::string regexStr, std::string data)
{
return std::regex_match(data, std::regex(regexStr));
}

User::User()
{
}

User::User(std::string email, std::string password, std::string username)
{
setEmail(email);
setPassword(password);
setUsername(username);
}

User::~User()
{
}

void User::setEmail(std::string email)
{
bool bValid = validate(userEmailRegex, email);
if (bValid)
{
    this->email = email;
}
else
{
    this->email = "default@default.com";
}
}

Main.cpp 文件

#include "pch.h"
#include "User.h"

User u;

int main()
{
std::vector<User> v;

std::string email = u.getEmail();
std::cout << "Email: ";
std::cin >> email;

}

【问题讨论】:

  • 该正则表达式甚至不接近正确,并且使许多使用TLDs longer than 4 letters 的常见电子邮件地址无效。检查@。尝试交付。这就是您验证电子邮件地址的方式。其他一切都是关于 ICANN 下一步将做什么的疯狂猜测。对于“默认”电子邮件地址,请使用 invalid@nil 而不是 default.com 之类的东西,后者实际上归某人所有。
  • 另外,因为这是 C++,所以使用 const std::string&amp; 作为参数。使用 std::string 会为所提供的每个值创建毫无意义的副本。
  • 如果你想让所有的角落都正确,使用正则表达式验证电子邮件真的很复杂。如果您只是想检查是否有人输入了看起来像电子邮件的内容,我会选择“.+@.+”

标签: c++


【解决方案1】:

对于您的正则表达式,您忘记转义 .,否则它表示任何字符(\n 除外)。

R"([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))"

但这不是验证电子邮件的正确方法,请参阅can-it-cause-harm-to-validate-email-addresses-with-a-regex

【讨论】:

  • 这仍然是绝对错误的,并且会拒绝大量有效的电子邮件。这种幼稚的正则表达式弊大于利。
  • @tadman:我同意,我用非转义点修复了 OP 的意图。并提供链接来解释为什么通过正则表达式验证电子邮件是错误的方式。
  • Ken White 已经在 cmets 上面发布了一个更好的建议。
  • 它也会允许一些时髦的,例如,not@server@shop.com 是可以的。
猜你喜欢
  • 2014-03-03
  • 2015-12-20
  • 1970-01-01
  • 2014-05-24
  • 2020-07-22
  • 2014-12-09
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多