我正在尝试使用stringr库从一个混乱的大文件中提取电子邮件。
str_match不允许perl=TRUE,并且我无法弄清楚转义字符以使其工作。
有人能推荐一个相对强大的正则表达式,适用于下面的情况吗?
c("larry@gmail.com", "larry-sally@sally.com", "larry@sally.larry.com")->emails
"SomeRegex"->regex
str_match(emails, regex)
> "^[[:alnum:].-_]+@[[:alnum:].-]+$"->regex
> str_match(emails, regex)
[,1]
[1,] "larry@gmail.com"
[2,] "larry-sally@sally.com"
[3,] "larry@sally.larry.com"
在正则表达式中,@符号不需要转义。而"."和"-"在字符类中也没有特殊意义。如果您想要添加对".com"、".co"、".edu"、".org"的需求,则需要指定该列表需要多完整。
正如M42所指出的那样,这并不是一种百分之百有效的方法。事实上,据称没有百分之百有效的方法:使用正则表达式验证电子邮件地址
...@---
。 - Toto^[[:alnum:].-_\\+]+@[[:alnum:].-]+$
来包括 "@" 前面的部分中的 "+" 符号(这是一个有效的地址,可以在 Gmail 和 G Suite 中用于创建别名)。 - Adi Sarid^[[:alnum:]._-]+@[[:alnum:].-]+$
在字符类中,除非连字符是最后一个字符,否则它具有特殊含义。它是一个范围运算符,例如“A-Z”。
test@test.com.
这样带有尾随点的电子邮件。isMail <- function(x){
grepl("^[[:alnum:]._-]+@[[:alnum:].-]+$", x))
}
"^[[:alnum:]._-]+@[[:alnum:].-]+[:alnum:]+$"
- SJGD
.*
来匹配所有这些情况,对吗? - Frankgrep("@", emails)
,它会正确匹配。 - RJ-str_match
仅提取第一个匹配组。这是您想要的吗?还是您想要提取所有匹配组? - RJ-R
中,grep 通常会将多个字符串的向量与一个正则表达式进行匹配。 - hwnd