R grep由特殊字符分隔的整词

R grep由特殊字符分隔的整词,r,regex,R,Regex,假设有一个序列向量,其形式为“foo”或“foo | baz | bar”(一个单词或多个单词,由特殊字符分隔,如“|”),我们还得到了一个单词,我们希望找到该向量的哪些项与整个单词相匹配 例如,单词“foo”在“foo | baz | bar”中有一个完整的匹配项,但在“foobaz | bar”或“bazzoo”中都没有完整的匹配项 首先,我尝试使用“\\b”来指示整个单词的开始边缘或结束边缘,并成功地工作: grep("\\bfoo\\b", "foo") # match

假设有一个序列向量,其形式为
“foo”
“foo | baz | bar”
(一个单词或多个单词,由特殊字符分隔,如
“|”
),我们还得到了一个单词,我们希望找到该向量的哪些项与整个单词相匹配

例如,单词
“foo”
“foo | baz | bar”
中有一个完整的匹配项,但在
“foobaz | bar”
“bazzoo”
中都没有完整的匹配项

首先,我尝试使用
“\\b”
来指示整个单词的开始边缘或结束边缘,并成功地工作:

grep("\\bfoo\\b", "foo")         # match
grep("\\bfoo\\b", "foobaz|bar")  # mismatch    
grep("\\bfoo\\b", "bazfoo")      # mismatch
然后我尝试添加
“|”
作为另一个可能的两端分隔符,并使用
[
]
将其与
“\\b”
分组:

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
>z x sapply(strsplit(z,split=“|”,fixed=TRUE),函数(x,y)y%在%x,x中)
[,1]  [,2]  [,3]
[1,]对错错错
[2,]错

您可以使用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
>z x sapply(strsplit(z,split=“|”,fixed=TRUE),函数(x,y)y%在%x,x中)
[,1]  [,2]  [,3]
[1,]对错错错
[2,]错

由于
在正则表达式中有特殊含义,因此需要对其进行转义,即使用
\\\\\\

ptn <- "\\bfoo[\\|\\b]"

grep(ptn, "foo|baz|bar") 
[1] 1

grep(ptn, "foo")          
integer(0)

ptn由于
\
在正则表达式中具有特殊含义,因此需要对其进行转义,即使用
\\\\\\\

ptn <- "\\bfoo[\\|\\b]"

grep(ptn, "foo|baz|bar") 
[1] 1

grep(ptn, "foo")          
integer(0)
ptn这也可以:

gregexpr("foo|", "foo|baz|bar", fixed = TRUE)[[c(1, 1)]] > 0
gregexpr("foo|", "foobaz|bar", fixed = TRUE)[[c(1, 1)]] > 0    
gregexpr("foo|", "bazfoo", fixed = TRUE)[[c(1, 1)]] > 0 
这种方法的不同之处在于,您可以利用您提供的
gregexpr
间距选项来查找由两个单词组成的单词:

gregexpr("foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0 
gregexpr("  foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0 
这也将有助于:

gregexpr("foo|", "foo|baz|bar", fixed = TRUE)[[c(1, 1)]] > 0
gregexpr("foo|", "foobaz|bar", fixed = TRUE)[[c(1, 1)]] > 0    
gregexpr("foo|", "bazfoo", fixed = TRUE)[[c(1, 1)]] > 0 
这种方法的不同之处在于,您可以利用您提供的
gregexpr
间距选项来查找由两个单词组成的单词:

gregexpr("foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0 
gregexpr("  foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0 

\b在以下位置进行匹配

  • 在字符串的第一个字符之前,如果第一个字符是单词字符
  • 如果最后一个字符是单词字符,则在字符串中最后一个字符之后
  • 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。(单词字符为a-zA-Z1-9)
  • 因为|在正则表达式中代表交替运算符,所以您必须将其转义

    因此正则表达式
    \bfoo\b
    将匹配
    foo | bar
    中的
    foo
    ,因为|是非单词字符。无需使用字符集
    [\b\|]


    编辑:正如flodel在下面指出的那样\b在字符集中表示退格字符。因此它将匹配| inside[\b\|]而不是单词边界。

    \b在以下位置匹配

  • 在字符串的第一个字符之前,如果第一个字符是单词字符
  • 如果最后一个字符是单词字符,则在字符串中最后一个字符之后
  • 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。(单词字符为a-zA-Z1-9)
  • 因为|在正则表达式中代表交替运算符,所以您必须将其转义

    因此正则表达式
    \bfoo\b
    将匹配
    foo | bar
    中的
    foo
    ,因为|是非单词字符。无需使用字符集
    [\b\|]


    编辑:正如flodel在下面指出的那样\b在字符集中表示退格字符。因此,它将匹配| inside[\b\|]而不是单词边界。

    谢谢,但我更感兴趣的是,为什么grep(“[\b]foo[\b]”,“foo”)不匹配?因为你需要逃避
    。出于同样的原因,我选择在
    strsplit
    内部使用
    fixed=TRUE
    。如果我只寻找“|”作为分隔符,\\b”不是一个好的选择,因此您的答案在这种情况下似乎更好。它在编程方面也很友好:正如您所看到的,创建正则表达式模式不需要难看的粘贴。谢谢flodel。你的答案很完美。我希望能够为这个问题选择3个正确答案——我甚至试过!谢谢,但我更感兴趣的是想知道为什么grep(“[|\\b]foo[|\\b],“foo”)不匹配?因为你需要逃避
    。出于同样的原因,我选择在
    strsplit
    内部使用
    fixed=TRUE
    。如果我只寻找“|”作为分隔符,\\b”不是一个好的选择,因此您的答案在这种情况下似乎更好。它在编程方面也很友好:正如您所看到的,创建正则表达式模式不需要难看的粘贴。谢谢flodel。你的答案很完美。我希望能够为这个问题选择3个正确答案——我甚至试过!谢谢你的评论。我发现即使是“\\bfoo\\b”也能实现我的目标。你认为你的答案需要改进吗?@AliSharifi如果你想改进我的答案,请继续。我相信我已经回答了你的问题。这里有一些有趣的事情:
    grep(“afooa”,“afooa”)
    给出了一个匹配。grep(“[a]foo[a]”,“afooa”)
    也是如此。
    grep(“\\bfoo\\b”,“foo”)
    也是如此,但不是
    grep([\\b]foo[\\b],“foo”)
    。知道吗?我在这里找到了我问题的答案:。在字符类中,\b是退格字符。。所以这不是一个好方法。谢谢你的评论。我甚至发现“\\bfoo\\