R 匹配“的实例”;"富",;后面不跟“;酒吧;

R 匹配“的实例”;"富",;后面不跟“;酒吧;,r,regex,R,Regex,如何匹配后跟“foo”和“bar”以外的字符串(foo末尾有单词边界) 例子 library(stringr) str_detect("foo 123", "\\bfoo\\b^(bar)") # should be TRUE str_detect("foo", "\\bfoo\\b^(bar)") # should be TRUE str_detect("foo bar", "\\bfoo\\b^(bar)") # should be FALSE 显然,我所尝试的,\\bfoo\\b^

如何匹配后跟“foo”和“bar”以外的字符串(foo末尾有单词边界)

例子

library(stringr)
str_detect("foo 123", "\\bfoo\\b^(bar)")  # should be TRUE
str_detect("foo", "\\bfoo\\b^(bar)")  # should be TRUE
str_detect("foo bar", "\\bfoo\\b^(bar)")  # should be FALSE

显然,我所尝试的,
\\bfoo\\b^(bar)
是不正确的。

如果是消极的前瞻,您可以使用以下内容:

\bfoo\b(?!\W+bar)

显然,如果
\
在R中是非法的,您需要逃逸它,因此您可以使用
\\bfoo\\b(?!\\W+bar)


如果
bar
也必须是一个完整的单词,您可以在末尾添加一个额外的
\b

\bfoo\b(?!\W+bar\b)

.

在一般情况下,要检测
foo
后面没有
bar
(位于
foo
右侧的任何位置)的存在,可以使用带
perl=TRUE
参数的基本R
grep

x <- c("foo bar", "foo")
grep("(?s)foo(?!.*bar)", x, perl=TRUE, value=TRUE)

是的,别忘了在R代码中双转义反斜杠。

这样,在foo之后的任何地方都不会出现条?或者只是后面的词?
foo(?!\s+bar) - no "bar" after "foo" separated with 1+ whitespaces from it
foo(?!\W+bar) - no "bar" after "foo" separated with 1+ non-word chars from it
foo(?!\w*bar) - no "bar" after "foo" in the same "word" (digits, letters, _)
foo(?!\p{L}*bar) - no "bar" after "foo" in the same letter-word