匹配以已知模式开头的单词

时间:2014-08-08 01:54:02

标签: regex r stringr

我正在努力匹配一个以已知模式开头并以白色空格或字符串结尾结束的整个单词。我想我有这个词的模式:

pat <- "https?:\\/\\/.*"

require(stringr)
str_extract("http://t.co/som7hing", pat)
# [1] "http://t.co/som7hing" # So far so good...

我没有得到的是如何定义单词的边界。有四种可能的情况需要考虑:

  1. 我的网址位于字符串的开头
  2. 我的网址位于字符串的末尾
  3. 我的网址前面有一些其他令牌
  4. 我的网址后跟其他一些令牌
  5. 在所有四种情况下,我的模式应该只匹配URL,从开始到结束。

    str_extract("something something http://t.co/som7hing", pat)
    # [1] "http://t.co/som7hing" 
    

    到目前为止一直很好......

    str_extract("http://t.co/som7hing ", pat)
    # [1] "http://t.co/som7hing " 
    

    第一个问题,尾随空格也匹配

    str_extract("http://t.co/som7hing #hash name", pat)
    # [1] "http://t.co/som7hing #hash name" 
    

    第二个问题所有尾随单词都匹配

3 个答案:

答案 0 :(得分:4)

您正在寻找的模式是

pat <- "https?:\\/\\/\\S*"

正则表达式中的.将匹配任何字符,包括空格。你想要的是匹配任何非空格字符,这是使用\S完成的。

答案 1 :(得分:4)

*greedy运营商;导致尾随空格和尾随单词匹配的问题。因此,.*将尽可能多地匹配,并且仍允许正则表达式的其余部分匹配。

我建议使用以下正则表达式:

re <- '\\bhttps?://\\S+'

我们使用的\bword boundary。单词边界不消耗任何字符。它断言,一方面有一个字符,而另一方则没有。 \S匹配任何非空白字符。

您可以看到我们在您发布的示例中执行此操作。

x  <- c('http://t.co/som7hing', 
        'http://t.co/som7hing ',
        'something something http://t.co/som7hing', 
        'http://t.co/som7hing #hash name',
        'foohttp://www.example.com',
        'barhttp://www.foo.com    ')

re <- '\\bhttps?://\\S+'

for (i in x) print(str_extract(i, re))
# [1] "http://t.co/som7hing"
# [1] "http://t.co/som7hing"
# [1] "http://t.co/som7hing"
# [1] "http://t.co/som7hing"
# [1] NA
# [1] NA

由于字边界,最后两个不匹配,现在如果要在字符串中的任何位置匹配前缀,请从正则表达式中删除边界。

答案 2 :(得分:0)

我认为这样做了。它匹配一个空间,并停在那里。我使用反斜杠来逃避冒号和地址的正斜杠。我没有匹配任何数字的任何字符,而是匹配任何不是空格的字符[!\ S]

https?\:\/\/[!\S]*

我已在http://regexpal.com/

中对此进行了测试