正则表达式环视函数,中间有不相关的文本

Regex lookaround function with irrelevant text in the middle

我的文本应该包含 tip 然后是 top,此外,如果 tap 位于 tip 和 top 之间(按此顺序,即 tip...tap...top),则 tip 和 tap 之间不能有其他顶部(按照这个顺序,即提示...顶部...点击...顶部是禁止的)。

一些例子

1. "tip tip top tip tip" TRUE
2. "top tip tup tip tap top" TRUE
3. "tip top tap tap top" FALSE
4. "tip tup top tap tap top" FALSE
5. "tip top tap tap tip" TRUE

我试过使用 lookarounds,例如

condition = (tip.*top) & (tip(?!.*top).*tap.*top)
str_detect("mytext", condition)

但是没用。

这是一个工作示例:

mytext = c("tip tip top tip tip" , "top tip tup tip tap top" ,
           "tip top tap tap top" , "tip tup top tap tap top" , "tip top tap tap tip" )
condition = "(tip.*top) & (tip(?!.*top).*tap.*top)"
str_detect(mytext, condition)

这给出了

[1] FALSE FALSE FALSE FALSE FALSE

而不是 T T F F T

如果我们这样做会怎样:

mytext = c("tip tip top tip tip" , "top tip tup tip tap top" ,
 "tip top tap tap top" , "tip tup top tap tap top" , "tip top tap tap tip" )
str_detect(mytext, "tip.*top") & !str_detect(mytext, "tip.*top.*tap.*top")

TRUE
TRUE
FALSE
FALSE
TRUE

@KevinDialdestoro 给出了我会使用的解决方案,但如果你真的想把它全部放在一个正则表达式中,这里是他的解决方案翻译成正则表达式语言:

str_detect(mytext, "(?=.*tip.*top)(?!.*tip.*top.*tap.*top)")

(?=...) 部分是“non-consuming 前瞻”,(?!...) 部分是否定。

编辑添加:我的第一篇文章写错了。我认为它现在已经修复了,但这就是为什么凯文的解决方案更好:它显然是正确的。