我正在尝试使用lookahead来查找与短语开头的某个子表达式匹配但后来与某个子表达式不匹配的字符串。
例如,我想要这个
temp <- c("hello_i_am_in_the_park", "hey, park your car here")
grep("h.*park.*(?!here)", temp, perl=T,value=T)
返回:
[1] "hello_i_am_in_the_park"
但我得到了:
[1] "hello_i_am_in_the_park" "hey, park your car here"
我认为这与。*的非贪婪有关,但似乎无法弄清楚如何修改表达式以使其更贪婪。
答案 0 :(得分:4)
您需要将.*
放入前瞻:
h.*park(?!.*here)
^^
请参阅regex demo
这个正则表达式将以这种方式工作:
h
- 匹配第一个h
(前缀为^
以匹配字符串的开头).*
- 将匹配除换行符之外的0+个字符(因为这是PCRE正则表达式,默认情况下.
与换行符不匹配)park
- 匹配文字park
(?!.*here)
- 如果除了后跟here
子字符串的换行符以外的其他0个字符,则会导致匹配失败的否定前瞻。如果您的文字有换行符,且here
可能位于park
下方的另一行,则需要添加内联修饰符(?s)
:
"(?s)h.*park(?!.*here)"
另一种正则表达式是在字符串的开头立即执行检查:
^(?!.*here)h.*park
请参阅regex demo。这样,我们会快速检查禁止的子字符串,如果存在,则不会搜索h
,不会搜索.*
和park
。
最后但并非最不重要:如果您只需要匹配整个单词,请不要忘记添加\b
字边界:
"^(?!.*\\bhere\\b)h.*\\bpark\\b"