我正在努力匹配一个以已知模式开头,以空格或字符串结尾结束的完整单词。我想我有这个词的句型:
pat <- "https?:\\/\\/.*"
require(stringr)
str_extract("http://t.co/som7hing", pat)
# [1] "http://t.co/som7hing" # So far so good...我不明白的是如何定义这个词的界限。有四种可能的情况需要考虑:
在所有四种情况下,我的模式应该只匹配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" 第二个问题,所有尾随词都匹配。
发布于 2014-08-08 02:02:54
你要找的模式是
pat <- "https?:\\/\\/\\S*"regex中的.将匹配任何字符,包括空格。您想要的是匹配任何非空白字符,这是使用\S完成的。
发布于 2014-08-08 02:05:36
*是一个贪婪操作符;在匹配尾随空格和尾随词时都会出现问题。因此,.*将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。
我建议使用以下正则表达式:
re <- '\\bhttps?://\\S+'我们使用\b,这是一个字界。单词边界不消耗任何字符。它断言,一边有一个字字,另一边没有字。\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-08 02:08:11
我觉得这很管用。它与一个空间相匹配,然后停在那里。我使用反斜杠来转义地址中的冒号和正斜杠。我没有匹配任何数字的字符,而是匹配了任何不是空格的字符!\S
https?\:\/\/[!\S]*我在http://regexpal.com/上测试过这个
https://stackoverflow.com/questions/25194970
复制相似问题