我在验证国际邮件地址时遇到了一些问题,例如john.doe@神谕.com
、sara.smith@神谕.com
、babu.ratnakar+आଆఉఊګ神谕@gmail.com
和testæœö.神谕#$&*éùôß@äßæçëêùé+आଆ神谕.com
。我想用C ++中的REGEX解决这个问题,并使内容更加通俗易懂。以下是在Java中工作正常的正则表达式:
^[\\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])?$
我尝试在C++中进行轻微修改后使用相同的方法
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
时,它接受带有英文字母的电子邮件地址。也就是说,这个可以工作:
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);
/p{L}
在C++中不能匹配Unicode字符吗?
\\
)? - πάντα ῥεῖ"^(?:(?:[^<>()\\[\\].,;:\\s@\"]+(?:\\.[^<>()\\[\\].,;:\\s@\"]+)*)|\".+\")@(?:(?:[^<>()\\[\\].,;:\\s@\"]+\\.)+[^<>()\\[\\].,;:\\s@\"]{2,})$"
жҳҜеҗҰйҖӮз”ЁдәҺжӮЁгҖӮе®ғеңЁ иҝҷйҮҢ еҸ‘еёғгҖӮ - Wiktor Stribiżew