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

时间:2011-12-08 21:49:04

标签: regex r regex-negation

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

> grepl("^[^abc].+$", "foo")
[1] TRUE
> grepl("^[^abc].+$", "afoo")
[1] FALSE

我想执行grepl("^[^(abc)].+$", "afoo")之类的操作并获取TRUE,即匹配字符串是否不以abc序列开头。

请注意,我知道this post,我也尝试使用perl = TRUE,但没有成功:

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

有什么想法吗?

3 个答案:

答案 0 :(得分:24)

呀。将零宽度预测/外部/其他parens。这应该给你这个:

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

我认为这就是你想要的。

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

答案 1 :(得分:2)

我陷入了以下特殊情况,所以我想我会分享......

如果正则表达式有多个实例,但您仍然只想要第一个段?

,该怎么办?

显然你可以关闭搜索的隐含贪婪 具体perl wildcard modifiers

假设我想要处理的字符串是

myExampleString = paste0(c(letters[1:13], "_", letters[14:26], "__",
                           LETTERS[1:13], "_", LETTERS[14:26], "__",
                           "laksjdl", "_", "lakdjlfalsjdf"),
                         collapse = "")
myExampleString
  

" abcdefghijklm_nopqrstuvwxyz__ABCDEFGHIJKLM_NOPQRSTUVWXYZ__laksjdl_lakdjlfalsjd"

并且我只希望在第一个"__"之前的第一个细分受众群。 我不能简单地搜索"_",因为单下划线是 此示例字符串中允许的非分隔符。

以下不起作用。它反而给了我第一个第二个段,因为默认的贪婪(但不是第三个,因为前瞻性)。

gsub("^(.+(?=__)).*$", "\\1", myExampleString, perl = TRUE)
  

" abcdefghijklm_nopqrstuvwxyz__ABCDEFGHIJKLM_NOPQRSTUVWXYZ"

但这确实有效

gsub("^(.+?(?=__)).*$", "\\1", myExampleString, perl = TRUE)
  

" abcdefghijklm_nopqrstuvwxyz"

不同之处在于通配符"?"之后的贪婪修饰符".+" 在(perl)正则表达式中。

答案 2 :(得分:1)

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

library(stringr)

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

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

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