我的正则表达式
(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
。