如何在不使用 的情况下匹配所有以开头plan_且不结尾的单词?在下面的示例中,我只想匹配第二个字符串。我尝试使用负前瞻,但它不起作用,也许是因为贪婪?templateinvert = TRUE
names <- c("plan_x_template", "plan_x")
grep("^plan.*(?!template)$",
names,
value = TRUE, perl = TRUE
)
#> [1] "plan_x_template" "plan_x"
Run Code Online (Sandbox Code Playgroud)
我的意思是也可以通过两个正则表达式调用来解决问题,但我想看看它是如何以另一种方式工作的:-)
is_plan <- grepl("^plan_", names)
is_template <- grepl("_template$", names)
names[is_plan & !is_template]
#> [1] "plan_x"
Run Code Online (Sandbox Code Playgroud)
您可以使用
names <- c("plan_x_template", "plan_x")
grep("^plan(?!.*template)",
names,
value = TRUE, perl = TRUE
)
Run Code Online (Sandbox Code Playgroud)
查看R 在线演示
模式^plan(?!.*template)匹配:
^- 字符串的开头plan- 一个plan子串(?!.*template)-如果紧邻当前位置的左侧有 0+ 个除换行符之外的字符,则匹配失败的负向前瞻perl = TRUE(因为使用了并且使用 PCRE 引擎处理模式,因此.不匹配所有可能的字符)与默认的 TRE 正则表达式引擎相反grep),尽可能多,后跟template子字符串。注意:如果是多行字符串,您需要在正则表达式中使用 DOTALL 修饰符"(?s)^plan(?!.*template)"。