3

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

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

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

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

  1. 我的网址在字符串的开头
  2. 我的网址在字符串的末尾
  3. 我的 URL 前面有一些其他标记
  4. 我的 URL 后跟一些其他令牌

在所有四种情况下,我的模式应该只匹配 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" 

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

4

3 回答 3

4

*是一个贪心算子;导致尾随空格和匹配尾随单词的问题。因此,.*将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。

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

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

我们使用\bwhich is a word 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

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

于 2014-08-08T02:05:36.080 回答
4

您正在寻找的模式是

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

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

于 2014-08-08T02:02:54.600 回答
0

我认为这可以解决问题。它匹配到一个空间,并停在那里。我使用反斜杠来转义地址中的冒号和正斜杠。我没有匹配任何数字的任何字符,而是匹配任何不是空格的字符 [!\S]

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

我已经在http://regexpal.com/中对此进行了测试

于 2014-08-08T02:08:11.163 回答