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