我在验证john.doe@神谕.com
,sara.smith@神谕.com
,babu.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 ++中不起作用?
答案 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,})")