Lookarounds是零宽度断言,这意味着当模式匹配时正则表达式索引没有移动(匹配的字符没有添加到匹配值,连续的Lookarounds都从同一位置开始其模式检查)。所以
(?=bcl-?2)(?!.*not)(?=.*detected)
匹配后跟的空位置(空字符串)
bcl2
或
bcl-2
not
除换行符以外的任何0+字符后的子字符串,后面跟
detected
在除换行符以外的任何0+字符之后。由于没有锚,因此在输入字符串中的每个位置都会尝试此模式。这种模式很难满足你的需要。
以下是一个可能的解决方案:
\bbcl-2\b(?:(?!\bbcl-\d|\bnot\b).)*?\bdetected\b
请参阅
regex demo
-
\b
-单词边界
-
bcl-2
-a
bcl-2
-
\b
-单词边界
-
(?:(?!\bbcl-\d|\bnot\b).)*?
-(a)
tempered greedy token
)任何0+(但尽可能少)字符,而不是不启动以下两个序列的换行符:
-
\bbcl-\d
bcl-
和一个数字
-
|
-或
-
\bnot\b
-一个完整的词
不
-
\bdetected\b
-一个完整的词
检测
查看
R demo
如下:
x <- c("bcl-2 was detected in 45% bcl-6 was not detected",
"bcl-2 was not detected bcl-6 was detected in 45%",
"no evidendce of bcl-2 bcl-6 was detected in 45%")
grep("\\bbcl-2\\b(?:(?!\\bbcl-\\d|\\bnot\\b).)*?\\bdetected\\b", x, perl=TRUE, value=TRUE)
## => [1] "bcl-2 was detected in 45% bcl-6 was not detected"