匹配字符串的开头但不匹配 R 中的结尾

Lor*_*ert 3 regex r

如何在不使用 的情况下匹配所有以开头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)

Wik*_*żew 5

您可以使用

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)"