5

我正在尝试使用 stringr 库从一个大而杂乱的文件中提取电子邮件。

str_match 不允许 perl=TRUE,我无法找出转义字符来使其工作。

有人可以推荐一个可以在下面的上下文中使用的相对强大的正则表达式吗?

c("larry@gmail.com", "larry-sally@sally.com", "larry@sally.larry.com")->emails
"SomeRegex"->regex
str_match(emails, regex)
4

3 回答 3

9
> "^[[:alnum:].-_]+@[[:alnum:].-]+$"->regex
> str_match(emails, regex)
     [,1]                   
[1,] "larry@gmail.com"      
[2,] "larry-sally@sally.com"
[3,] "larry@sally.larry.com"

@-sign 不需要在正则表达式中转义。和 ”。” 和“-”在字符类中并不特殊。如果您想为“.com”、“.co”、“.edu”、“.org”添加要求,那么您应该指定该列表需要的完整程度。

正如 M42 所指出的,这不是万无一失的方法。事实上,据称没有万无一失的方法:使用正则表达式验证电子邮件地址

于 2013-10-13T05:17:24.143 回答
3

我发现这个正则表达式对我来说效果更好:

^[[:alnum:]._-]+@[[:alnum:].-]+$

破折号在字符类中确实具有特殊含义,除非它是最后一个字符。它是一个范围运算符,如“AZ”

于 2016-10-28T19:20:06.213 回答
0

实际上,我建议使用更长的正则表达式,因为上面的解决方案允许test@test.com.使用带有尾随点的电子邮件。

isMail <- function(x){
   grepl("^[[:alnum:]._-]+@[[:alnum:].-]+$", x))
}
于 2019-03-21T22:25:20.020 回答