r regex - 确定的字符和单词边界之间的交替

时间:2018-04-03 18:47:16

标签: r regex

我正在尝试在向量中出现字符串。此字符串可以显示为“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取出了字符串的尖括号,但是我仍然不知道为什么上面的代码不起作用

1 个答案:

答案 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<]匹配退格字符或<