使用单行标志修饰符在正向前瞻之前获取第一个匹配项



我的正则表达式

(d*,d*) d*/d*(?=.*?Open Recall Check)

匹配所有感兴趣的东西,除了匹配太多。。。我只想在"公开召回检查"之前直接返回第一场里程赛。相反,它在所有里程上都匹配。

在我在regex101.com上的例子中,我得到了29个匹配项,但其中,我只试图返回以下10:

  • 75115(对应匹配1(
  • 92748(对应匹配7(
  • 62300(对应匹配8(
  • 55113(对应匹配9(
  • 109308(对应匹配11(
  • 138131(对应匹配17(
  • 125197(对应匹配24(
  • 55335(对应匹配25(
  • 69100(对应匹配28(
  • 6010(对应匹配29(

我认为可以做到这一点的一种方法是返回列表中的所有匹配项,然后只过滤短语"Open Recall Check"之前出现的任何匹配项,但我还没能弄清楚如何将该短语包含在列表中10次(我尝试过的每个正则表达式变体也包含了29次…所以没有太大帮助(。

我可以调整什么来获得所需的结果?

为了不匹配Open Recall Check之前的所有其他里程表读数,在匹配Open Recall Check的前瞻中,对于每个字符,您必须断言此时您不匹配另一个里程表读数。你可以在正面展望中使用负面展望:

(?=(?:.(?!(?:d+,)?d+ d+/d+))*?Open Recall Check)

请注意,您的里程表读数之一仅为5,因此您需要将数字和逗号设置为可选,以允许

((?:d+,)?d+)

此外,为了获得更好的regex性能,最好将d*转换为d+。总的来说,这给出了这个正则表达式:

((?:d+,)?d+) d+/d+(?=(?:.(?!(?:d+,)?d+ d+/d+))*?Open Recall Check)

regex101 演示

注意,根据您在regex101中输入的数据,匹配5实际上应该是5,而不是109,308

最新更新