我想使用正则表达式来查看字符串是否以某种模式开头。虽然我可以使用:[^
将某些字符列入黑名单,但我无法弄清楚如何将模式列入黑名单。
> 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
有什么想法吗?
答案 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创建