假设有一个 "foo"
或 "foo|baz|bar"
形式的序列向量(一个单词或多个单词由特殊字符分隔,例如"|"
),我们也得到了一个单词,我们想要找到它与向量中的哪些项目有整个单词匹配。
例如,单词 "foo"
在 "foo|baz|bar"
中有完整匹配,但在 "foobaz| 中没有完整匹配bar"
或 "bazfoo"
。
首先,我尝试使用 "\\b"
来指示整个单词的开始边缘或结束边缘,并且它成功运行:
grep("\\bfoo\\b", "foo") # match
grep("\\bfoo\\b", "foobaz|bar") # mismatch
grep("\\bfoo\\b", "bazfoo") # mismatch
然后我尝试添加 "|"
作为两端的另一个可能的分隔符,并使用 [
和]
:
grep("[|\\b]foo[|\\b]", "foo|baz|bar") # mismatch!
grep("[|\\b]foo[|\\b]", "foo") # mismatch!
后来发现\\b
不是字符串的开始或结束的指示符,而是整个单词的开始或结束(这么多字符,例如空格和 ,|-^.
但不是 数字和下划线 _
分隔整个单词)。所以 "[|\\b]foo[|\\b]"
匹配所有这些字符串:"foo"、"foo|bar|baz"、"foo-bar", "baz foo|bar"
但不是 "foo_bar"
或 "foo2"
。
但我的问题仍然存在:为什么 "[|\\b]foo[|\\b]"
模式无法与 "foo"
匹配?
最佳答案
你可以使用strplit
:
> "foo" %in% unlist(strsplit("foo|baz|bar", split = "|", fixed = TRUE))
[1] TRUE
您可以对其进行矢量化:
> z <- c("foo|baz|bar", "foobaz|bar", "bazfoo")
> x <- c("foo", "foot")
> sapply(strsplit(z, split = "|", fixed = TRUE), function(x,y)y %in% x, x)
[,1] [,2] [,3]
[1,] TRUE FALSE FALSE
[2,] FALSE FALSE FALSE
关于R grep整个单词由特殊字符分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12885257/