Java/Quickrex 正则表达式:使用否定先行时组中缺少字符

Java/Quickrex regex: missing character in group when using negative lookahaed

在Java中(使用Eclipse Quickrex插件进行测试)我使用了以下表达式:

(^[\.\(&\)]*)(.*)(?!([\.\(&/\)]*$))

匹配文本:

.(&&()..ABC----....D25..../)(&

预期目标是匹配三组:

(1) .(&&()..

(2) ABC----....D25

(3) ..../)(&

目标是进一步延续2组,砍掉前面的1号组和后面的3号组。要求是用户应该在三个单独的 GUI 字段中自己定义所有三个正则表达式。

发生了什么: 这三个组在 QuickRex 中匹配得很好,但是在第 2 组中 ABC----....D2 末尾的“5”丢失了,而且未出现在第 3 组中:

[.(&&()..][ABC----....D2]5[..../)(&]

环境:Eclipse Mars 4.5.2,Java 1.8.0_66,QuickRex 4.3.0

两个问题:

这是匹配这些组的正确方法吗?

没有包含“5”的逻辑原因或正则表达式引擎中的错误吗?

5 不包括在内,因为它无法匹配,因为否定前瞻 (?![.(&/)]*$) 使引擎回溯并找到 2 只有 [=14= 后面没有]、(&/) 个符号。

为了匹配你需要的 2 组(正如你提到的,第 3 组无论如何都会被丢弃),你可以将第二组中的贪婪 * 量词变成惰性量词 *? (在后续子模式第一次出现之前匹配除换行符之外的任何字符)并将否定前瞻变成一个组(使 .*? 在模式之前停止):

^([.(&)]*)(.*?)([.(&/)]*$)

regex demo

详情:

  • ^ - string/line
  • 的开始
  • ([.(&)]*) - 第 1 组从字符 class
  • 中捕获零个或多个字符
  • (.*?) - 除换行符外的任何 0+ 个字符尽可能少,直到第一个
  • ([.(&/)]*$) - .,或(,或&,或/,或),向上出现零次或多次到字符串的末尾。