R-regex:匹配不以模式开头的字符串

aL3*_*3xa 15 regex r regex-negation

我想使用正则表达式来查看字符串是否不以某种模式开头.虽然我可以使用:[^将某些字符列入黑名单,但我无法弄清楚如何将模式列入黑名单.

> grepl("^[^abc].+$", "foo")
[1] TRUE
> grepl("^[^abc].+$", "afoo")
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

我想做类似的事情grepl("^[^(abc)].+$", "afoo")并获得TRUE,即如果字符串不是以abc序列开始匹配.

请注意,我知道这篇文章,我也尝试过使用perl = TRUE,但没有成功:

> grepl("^((?!hede).)*$", "hede", perl = TRUE)
[1] FALSE
> grepl("^((?!hede).)*$", "foohede", perl = TRUE)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Dan*_*Dan 24

是啊.将零宽度预测/外部/其他parens.这应该给你这个:

> grepl("^(?!hede).*$", "hede", perl = TRUE)
[1] FALSE
> grepl("^(?!hede).*$", "foohede", perl = TRUE)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

我认为这就是你想要的.

或者,如果您想捕获整个字符串,^(?!hede)(.*)$并且^((?!hede).*)$它们都是等效且可接受的.


pas*_*asi 5

现在(几年后)该软件包还有另一种可能性stringr

library(stringr)

str_detect("dsadsf", "^abc", negate = TRUE)
#> [1] TRUE

str_detect("abcff", "^abc", negate = TRUE)
#> [1] FALSE
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2020-01-13 创建