无法用特殊字符grep整个单词匹配

时间:2015-04-11 17:51:58

标签: regex r grep

我知道为了整个单词而不是它的一部分,你应该使用'\ b'。但是,我无法在文本中使用某个单词。见下文

> grep("£m","formal offer £m borussia dortmund captain mats hummels")
[1] 1
> grep("\\b£m\\b","formal offer £m borussia dortmund captain mats hummels")
integer(0)

1 个答案:

答案 0 :(得分:0)

这基本上是Regular Expression Word Boundary and Special Characters的副本。我最初认为有一些关于£的“特殊性”正在弄乱正则表达式计算,但事实证明它不被认为是字母数字字符。 \b代表单词(字母数字)字符和非单词字符之间的边界,因此如果£不是字母数字,则“£”不是非字母数字(“”)和字母数字字符之间的边界。 (链接的问题适用于“+”而非“£”,但逻辑相似。)

让我们测试一下:

grep("\\w","£")
## integer(0)
grep("[[:alnum:]]","£")  ## equivalent
## integer(0)
grep("\\W","£")  ## search for not-word character ("[^[:alnum:]]")
## 1

@akrun指出,如果你想要,你可以寻找空格字符:

v <- "formal offer £m borussia dortmund captain mats hummels"
grep("\\s£m\\s",v)
## 1

最准确地说,您可以在搜索集中明确包含£:

grep("[^[:alnum:]£]£m[^[:alnum:]£]",v)

但是那很难看,而且我认为它没有正确地匹配开头/结尾(我还没有测试过)。也许正则表达式专家可以告诉你如何更干净地做到这一点。