gpt4 book ai didi

regex - 使用正则表达式匹配递增整数列表

转载 作者:行者123 更新时间:2023-12-04 01:39:21 26 4
gpt4 key购买 nike

是否可以匹配逗号分隔的十进制整数列表,其中列表中的整数总是加一?

这些应该匹配:

0,1,2,3
8,9,10,11
1999,2000,2001
99,100,101

这些不应该匹配(整体上 - 最后两个具有匹配的子序列):
42
3,2,1
1,2,4
10,11,13

最佳答案

是的,当使用支持反向引用和条件的正则表达式引擎时,这是可能的。

首先,可以将连续数字的列表分解为一个列表,其中每对数字都是连续的:

(?=(?&cons))\d+
(?:,(?=(?&cons))\d+)*
,\d+

这里 (?=(?&cons))是确保两个数字是连续的谓词的占位符。该谓词可能如下所示:
(?<cons>\b(?:
(?<x>\d*)
(?:(?<a0>0)|(?<a1>1)|(?<a2>2)|(?<a3>3)|(?<a4>4)
|(?<a5>5)|(?<a6>6)|(?<a7>7)|(?<a8>8))
(?:9(?= 9*,\g{x}\d (?<y>\g{y}?+ 0)))*
,\g{x}
(?(a0)1)(?(a1)2)(?(a2)3)(?(a3)4)(?(a4)5)
(?(a5)6)(?(a6)7)(?(a7)8)(?(a8)9)
(?(y)\g{y})
# handle the 999 => 1000 case separately
| (?:9(?= 9*,1 (?<z>\g{z}?+ 0)))+
,1\g{z}
)\b)

简单说明,第二种情况处理 999,1000类型对更容易理解——在 this answer concerned with matching a^n b^n 中有一个非常详细的描述它是如何工作的。 .两者之间的联系是,在这种情况下,我们需要匹配 9^n ,1 0^n .

第一种情况稍微复杂一些。它的最大部分处理增加十进制数字的简单情况,由于所述数字的数量,这相对冗长:
(?:(?<a0>0)|(?<a1>1)|(?<a2>2)|(?<a3>3)|(?<a4>4)
|(?<a5>5)|(?<a6>6)|(?<a7>7)|(?<a8>8))

(?(a0)1)(?(a1)2)(?(a2)3)(?(a3)4)(?(a4)5)
(?(a5)6)(?(a6)7)(?(a7)8)(?(a8)9)

第一个 block 将捕获数字是否为 N 到组 aN 中,然后第二个 block 将使用条件来检查使用了这些组中的哪一个。如果组 aN 不为空,则下一位应为 N+1。

第一种情况的其余部分处理像 1999,2000 这样的情况。 .这再次落入模式 N 9^n, N+1 0^n , 所以这是匹配 a^n b^n的方法的组合并增加一个十进制数字。 1,2的简单案例作为 n=0 的极限情况处理。

完整的正则表达式: https://regex101.com/r/zG4zV0/1

或者 (?&cons)如果支持递归子模式引用,谓词可以更直接地实现:
(?<cons>\b(?:
(?<x>\d*)
(?:(?<a0>0)|(?<a1>1)|(?<a2>2)|(?<a3>3)|(?<a4>4)
|(?<a5>5)|(?<a6>6)|(?<a7>7)|(?<a8>8))
(?<y>
,\g{x}
(?(a0)1)(?(a1)2)(?(a2)3)(?(a3)4)(?(a4)5)
(?(a5)6)(?(a6)7)(?(a7)8)(?(a8)9)
| 9 (?&y) 0
)
# handle the 999 => 1000 case separately
| (?<z> 9,10 | 9(?&z)0 )
)\b)

在这种情况下,两个语法 9^n ,1 0^n , n>=1 和 prefix N 9^n , prefix N+1 0^n , n>=0 几乎只是明确写出。

完整的替代正则表达式: https://regex101.com/r/zG4zV0/3

关于regex - 使用正则表达式匹配递增整数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39306590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com