R语言正则:如何正确否定后向查找,筛选无case_when前缀的%in%字符串?
问题原因分析
你的否定后向查找正则(?<!case_when\()(.*%in%)不符合预期的核心原因是对零宽度断言的作用范围理解偏差:
(?<!case_when\()是紧邻位置的否定后向断言,它只检查%in%前面直接相邻的位置是否不是case_when(,而非检查整个字符串中是否存在case_when(出现在%in%的前方。- 第二个字符串
case_when(a %in% c('b', 'e'))中,%in%的左侧紧邻内容是a,完全满足(?<!case_when\()的断言条件,因此grepl会找到这个匹配位置并返回TRUE,这和你的预期不符。
正确实现方式
如果你想实现“包含%in%但整个字符串中没有case_when(”的检测,有两种简单方案:
方案1:逻辑组合(最直观)
直接用两个grepl的逻辑与,明确筛选出含%in%且不含case_when(的字符串:
grepl("%in%", test) & !grepl("case_when\\(", test) # 结果:[1] TRUE FALSE FALSE
方案2:正向否定预查(正则断言方式)
用(?!...)正向否定预查,确保从字符串开头到%in%的区间内不存在case_when(:
grepl("^(?!.*case_when\\().*%in%", test, perl = TRUE) # 结果:[1] TRUE FALSE FALSE
这里^(?!.*case_when\()表示“从字符串开头起,任意位置都不存在case_when(”,后续的.*%in%确保字符串包含%in%,两者结合即可满足你的需求。
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

