【问题标题】:Match word beginning with known pattern匹配以已知模式开头的单词
【发布时间】:2014-10-01 10:19:15
【问题描述】:

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

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" 

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

【问题讨论】:

    标签: regex r stringr


    【解决方案1】:

    你要找的图案是

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      我们使用\b,即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
      

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

      【讨论】:

        【解决方案3】:

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

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

        我已经在 http://regexpal.com/ 中测试过这个

        【讨论】:

        • 在字符类中,用于进行否定的字符是^。但是,您根本不需要否定,因为 \S 表示 所有不是空白字符的字符(换句话说,[^\S] = \s
        猜你喜欢
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多