Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex easy正则表达式令人困惑_Regex_R - Fatal编程技术网

Regex easy正则表达式令人困惑

Regex easy正则表达式令人困惑,regex,r,Regex,R,我似乎无法从以下短语中获取电子邮件地址: “mailto:fwwrp-3492801490@yahoo.com" 到目前为止我已经试过了 regexpr(":([^\\?*]?)", phrase) 代码的逻辑如下所示: 以分号字符开头: 获取每个不是问号的字符 返回括号内的字符 我不确定我的正则表达式哪里出了问题。这里有一个使用gsub的非常简单的方法: gsub("([a-z]+:)(.*)([?]$)", "\\2", "mailto:fwwrp-3492801490@yahoo.com

我似乎无法从以下短语中获取电子邮件地址:

“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:谢谢,我喜欢把自己看作:)谢谢,阿纳多,我也会看一下你的答案。我喜欢你在分号前加上乱码的方法。
    :([^?]*)