我正在尝试在向量中出现字符串。此字符串可以显示为“string”或“< string>”,但在向量中只有“string”。所以:
> num <- c("one", "two")
> grepl("\\bone\\b", num)
[1] TRUE FALSE
> grepl("<one>", num)
[1] FALSE FALSE
好吧,直到现在我明白了,但是当我做到了
> grepl("[\\b<]one[\\b>]", num)
它返回
[1] FALSE FALSE
我需要它返回
[1] TRUE FALSE
在使用grepl之前,我使用gsub取出了字符串的尖括号,但是我仍然不知道为什么上面的代码不起作用
答案 0 :(得分:1)
[\\b<]
模式与单词边界和<
不匹配,因为在TRE正则表达式中,括号表达式中的反斜杠字面上被视为反斜杠(并匹配反斜杠)。 [\\b<]
匹配反斜杠,b
或<
。
您想要一个交替组,例如
grepl("(?:<|\\b)one(?:\\b|>)", num)
但是,它等于grepl("\\bone\\b)", num)
,因为<
和o
以及e
和>
之间存在单词边界。
如果char是 word char,那将更有意义,例如下划线:
grepl("(?:_|\\b)one(?:\\b|_)", num)
现在,它会在zero_one_two
内找到匹配项(之前的\bone\b
模式在此处无法匹配)。
即使您使用PCRE正则表达式,也不能在括号表达式中使用\b
作为单词边界,您仍需要进行替换。 E.g。
grepl("(?:_|\\b)one(?:\\b|_)", num, perl=TRUE) # Non-capturing group version
grepl("(?<=_|\\b)one(?=\\b|_)", num, perl=TRUE) # Lookaround version
但是,在PCRE正则表达式[\b<]
匹配退格字符或<
。