gpt4 book ai didi

regex - 可以在数字范围内使用反向引用吗?

转载 作者:行者123 更新时间:2023-12-03 15:27:31 28 4
gpt4 key购买 nike

我想匹配一个字符串,其中数字等于或大于捕获组中的数字。

例子:

  • 1x1 = 匹配
  • 1x2 = 匹配
  • 2x1 = 不匹配

  • 在我看来,正则表达式看起来像这样 (\d)x[\1-9]但这不起作用。是否可以使用正则表达式来实现这一点?

    最佳答案

    正如您所发现的,您不能在正则表达式中插入一个值,因为:

    Because character classes are determined when the regex is compiled... The only character class regex node type is "hard-coded list of characters" that was built when the regex was compiled (not after it ran part way and figured out what $1 might end up being).



    [ Source ]

    由于字符类不允许反向引用,反斜杠后跟一个数字在字符类中被重新利用:

    A backslash followed by two or three octal digits is considered an octal number.



    [ Source ]

    这显然不是你想要的 [\1-9] .但是由于在知道所有字符之前无法编译字符类,因此我们必须找到另一种方法。

    如果我们希望完全在正则表达式中执行此操作,我们将无法枚举所有可能的组合,因为我们必须检查所有捕获以找出匹配的。 For example :
    "1x2" =~ m/(?:(0)x(\d)|(1)x([1-9])|(2)x([2-9])|(3)x([3-9])|(4)x([4-9])|(5)x([5-9])|(6)x([6-9])|(7)x([7-9])|(8)x([89])|(9)x(9))/

    将在 $3 中包含“1”和“2”在 $4 ,但您必须搜索捕获 1 到 20 以查找每次是否有匹配项。

    对正则表达式结果进行后处理的唯一方法是使用正则表达式条件: (?(A)X) 哪里 A是一个条件和 X是由此产生的 Action 。

    Sadly conditionals are not supported by RE2 ,但我们将继续证明它可以做到。

    您想为 X 使用什么是 (*F) (或 (?!) 在 Ruby 2+ 中)强制失败: http://www.rexegg.com/regex-tricks.html#fail

    您想为 A 使用什么是 ?{$1 > $2} ,但是 only Perl will allow you to use code directly in a regex . Perl 将允许您使用:
    m/(\d)x(\d)(?(?{$1 > $2})(?!))/

    [ Live Example ]

    所以你的问题的答案是:“ 不,你不能用谷歌分析使用的 RE2 来做到这一点 ,但是你可以用 Perl 正则表达式来做到这一点。

    关于regex - 可以在数字范围内使用反向引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35601801/

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