使用Regex在C ++中进行国际电子邮件验证

时间:2016-06-22 07:48:08

标签: c++ regex

我在验证john.doe@神谕.comsara.smith@神谕.combabu.ratnakar+आଆఉఊګ神谕@gmail.com等国际电子邮件地址方面遇到了一些问题, 使用C ++中的REGEX {/ 1}}

以下正则表达式在Java中对我有用:

testæœö.神谕#$&*éùôß@äßæçëêùé+आଆ神谕.com

我尝试在C ++中稍作修改使用相同的内容

^[\\p{L}0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\p{L}0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?\\.)+[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?$

std::string str("[\\\\p{L}0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[\\\\p{L}0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\\\p{L}0-9](?:[\\\\p{L}0-9-]*[\\\\p{L}0-9])?\.)+[\\\\p{L}0-9](?:[\\\\p{L}0-9-]*[\\\\p{L}0-9])?"); std::regex rx4(str); 在所有情况下都失败了。我认为问题出在regex_match上。当我用\p{L}替换它时,它接受带有英文字母的电子邮件地址。即这一个正在运作:

a-z
匹配unicode字母的

std::regex rx3("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", std::regex::ECMAScript); 在C ++中不起作用?

1 个答案:

答案 0 :(得分:4)

C ++ std::regex supports 6 regex flavors

  

std::regex_constants 中定义了六种不同的正则表达式口味或语法:

     

ECMAScript:与JavaScript类似   basic:与POSIX BRE类似。
  extended:与POSIX ERE类似   grep:与基本相同,增加了处理换行符作为交替运算符   egrep:与扩展相同,添加处理换行符作为交替运算符   awk:与扩展相同,增加了对不可打印字符的支持公共转义。

这些都不支持 Unicode属性(或 Unicode类别类),例如\p{L},因此您无法在模式中使用\p{L}。< / p>

如果适合您,请使用您的解决方法:

std::regex rx3("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", std::regex::ECMAScript);

或来自known Validate email address in JavaScript? SO post的版本(删除锚点,因为您正在使用regex_match并重新转义以用于非原始字符串文字,而std::regex::ECMAScript因为它被使用默认值):

std::regex rx3("(?:(?:[^<>()\\[\\].,;:\\s@\"]+(?:\\.[^<>()\\[\\].,;:\\s@\"]+)*)|\".+\")@(?:(?:[^<>()‌​\\[\\].,;:\\s@\"]+\\.)+[^<>()\\[\\].,;:\\s@\"]{2,})")