当我匹配多个负前瞻或多个负后瞻时,我发现 R 的行为是不同的。为了说明,假设我想匹配除 str 中的 a、d、bd 或 bcd 之外的 z 之后的任何内容。以下正则表达式有效:
grep("z(?!a|(bc?)?d)",str,perl=TRUE)
接下来,我想匹配除 str 中的 a、b、bd 或 bcd 之外的 z 之前的任何内容。以类似方式构造的正则表达式失败(无效的正则表达式):
grep("(?<!a|b(c?d)?)z",str,perl=TRUE)
因此我不得不使用一个相当麻烦的正则表达式:
grep("(?<!a|b)(?<!bd)(?<!bcd)z",str,perl=TRUE)
似乎在(负)lookbehind的情况下,如果我想使用“或”运算符|,子表达式必须等长,但在(负)lookahead的情况下没有这样的限制。
我在这里想念什么吗?我的问题是我有很多模式可以匹配负面的后向案例。使用 | 和 ?将大大简化正则表达式,但由于上述原因,我不能使用它们。如何解决这个问题呢?