Regex easy正则表达式令人困惑
我似乎无法从以下短语中获取电子邮件地址: “mailto:fwwrp-3492801490@yahoo.com" 到目前为止我已经试过了Regex easy正则表达式令人困惑,regex,r,Regex,R,我似乎无法从以下短语中获取电子邮件地址: “mailto:fwwrp-3492801490@yahoo.com" 到目前为止我已经试过了 regexpr(":([^\\?*]?)", phrase) 代码的逻辑如下所示: 以分号字符开头: 获取每个不是问号的字符 返回括号内的字符 我不确定我的正则表达式哪里出了问题。这里有一个使用gsub的非常简单的方法: gsub("([a-z]+:)(.*)([?]$)", "\\2", "mailto:fwwrp-3492801490@yahoo.com
regexpr(":([^\\?*]?)", phrase)
代码的逻辑如下所示:
我不确定我的正则表达式哪里出了问题。这里有一个使用
gsub的非常简单的方法:
gsub("([a-z]+:)(.*)([?]$)", "\\2", "mailto:fwwrp-3492801490@yahoo.com?")
## Or, if you expect things other than characters before the colon
gsub("(.*:)(.*)([?]$)", "\\2", "mailto:fwwrp-3492801490@yahoo.com?")
## Or, discarding the first and third groups since they aren't very useful
gsub(".*:(.*)[?]$", "\\1", "mailto:fwwrp-3492801490@yahoo.com?")
在@Tylerlinker的起点之外,您还可以按如下方式使用strsplit
(以避免随后gsub
去掉问号):
如果你有这样的字符串列表呢
phrase <- c("mailto:fwwrp-3492801490@yahoo.com?",
"mailto:somefunk.y-address@Sqmpalm.net?")
phrase
# [1] "mailto:fwwrp-3492801490@yahoo.com?"
# [2] "mailto:somefunk.y-address@Sqmpalm.net?"
## Using gsub
gsub("(.*:)(.*)([?]$)", "\\2", phrase)
# [1] "fwwrp-3492801490@yahoo.com" "somefunk.y-address@Sqmpalm.net"
## Using strsplit
sapply(phrase,
function(x) strsplit(x, ":|\\?", fixed=FALSE)[[1]][2],
USE.NAMES=FALSE)
# [1] "fwwrp-3492801490@yahoo.com" "somefunk.y-address@Sqmpalm.net"
phrase让我们看看你的正则表达式,看看你错在哪里。我们将把它分开,以便更容易谈论:
:只是一个字面冒号,这里不用担心。
(打开捕获组。
[打开字符类,这将匹配一个字符。
^前导“^”表示“否定该类”
\\当正则表达式引擎看到它时,它将作为一个\结束,这将
转义下一个字符。
?这在字符类中没有特殊意义,有时是
问号只是个问号,这就是其中之一
转义一个简单的角色不会做任何有趣的事情。
*再说一次,我们在一个角色类中,所以*没有特别的意义。
]关闭角色类。
?零或前述模式之一。
)关闭捕获组。
去除噪声会给我们带来:([^?*]?)
因此,您的正则表达式实际上匹配:
冒号后跟零个或一个字符,这些字符不是问号或星号,并且非问号或非星号将位于第一个捕获组中
这和你想做的完全不同。几次调整应该会让你清醒过来:
:([^?]*)
这符合:
冒号后跟任意数量的非问号,非问号将位于第一个捕获组中
字符类外的*
是特殊的,字符类外的意思是“零或更多”,字符类内的只是一个*
我将把它留给其他人来帮助您解决R方面的问题,我只想让您了解正则表达式发生了什么。谢谢您将其分解。我意识到我的错误在哪里,我实际上应该做什么。这真的很有帮助。@user1103294:谢谢,我喜欢把自己看作:)谢谢,阿纳多,我也会看一下你的答案。我喜欢你在分号前加上乱码的方法。
:([^?]*)