【问题标题】:Regex to match a digit pattern with rotations正则表达式将数字模式与旋转匹配
【发布时间】:2021-03-25 02:40:58
【问题描述】:

我想匹配的是模式012345678901234567890123456789,还有345678901234567890123456789012。意思是,我想匹配此模式的前 30 个字符,但我事先不知道第一个数字。

有没有办法匹配这种模式的任何旋转?

【问题讨论】:

  • 在编程环境中,比使用正则表达式更容易做到这一点。
  • @trincot 我完全同意,正则表达式不是金锤子。

标签: regex


【解决方案1】:

这可以使用交替来完成,但是我不确定这在性能方面的效率如何:

^(?!.*(?:0[^1]|1[^2]|2[^3]|3[^4]|4[^5]|5[^6]|6[^7]|7[^8]|8[^9]|9[^0]))\d{30}$

查看在线demo,其中:

  • ^ - 开始字符串锚点。
  • (?! - 打开负前瞻:
    • .* - 0+ 个字符而不是换行符。
    • (?: - 打开非捕获组:
      • 0[^1]|1[^2]|2[^3]|3[^4]|4[^5]|5[^6]|6[^7]|7[^8]|8[^9]|9[^0] - 基本上确保所有数字后面都只有使用交替的适当后继。
      • ) - 关闭非捕获组。
    • ) - 关闭前瞻。
  • \d{30} - 30 位数。
  • $ - 结束字符串锚。

【讨论】:

  • 很好的解释是令人困惑的,因为您使用的是确保没有任何数字没有跟随其适当的继任者:) 非常好的解决方案。
  • 最后一位呢?那应该失败,因为它后面不是它的继任者而是行尾或其他字符?
  • @Jan,我假设 op 一次验证一个。我无法为多行验证实现适当的解决方案,但在这种情况下,您需要将换行符添加到字符类中。
  • @MichałTurczyn,我是不是搞砸了。我应该更加注意解释交替是你的意思吗?
  • 解释是有效的,因为它解释了最终目标是什么,所以总的来说我认为足够好:)
【解决方案2】:

为了确保任何字符组中的最后一位数字更积极(没有消极的前瞻,而是积极的前瞻):

编辑

为了适应任何顺序的请求,实际上更好

  • 搜索 29 位,后跟右边的一位
  • 后跟一位数,然后是右一位数:

添加换行符只是为了便于阅读!

(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){29}
((?<=0)1|(?<=1)2|(?<=2)3|(?<=3)4|(?<=4)5|(?<=5)6|(?<=6)7|(?<=7)8|(?<=8)9|(?<=9)0)

这对我来说现在看起来很完美:)

第一个解决方案在 I 连续 31 位上失败

(0(?=1|[^\d])|1(?=2|[^\d])|2(?=3|[^\d])|3(?=4|[^\d])|4(?=5|[^\d])|5(?=6|[^\d])|6(?=7|[^\d])|7(?=8|[^\d])|8(?=9|[^\d])|9(?=0|[^\d])){30}

这会搜索 0 到 9 的 30 个数字,后跟它们的后继或非数字:

https://regex101.com/r/rTYByt/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多