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

时间:2016-02-24 12:08:43

标签: regex google-analytics

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

示例:

  • > (define x (lambda (e) (+ e 1))) > (procedure? x) #t > (define y '(1 2 3)) > (procedure? y) #f > (define z 3) > (procedure? z) #f =匹配
  • 1x1 =匹配
  • 1x2 =不匹配

在我看来,正则表达式看起来像2x1,但这不起作用。是否可以使用正则表达式来实现这一目标?

1 个答案:

答案 0 :(得分:3)

正如您所发现的,您无法在正则表达式中插值,因为:

  

因为在编译正则表达式时确定了字符类...唯一的字符类正则表达式节点类型是在编译正则表达式时构建的“硬编码字符列表”(不是在它部分运行并计算出来之后)什么$ 1可能最终成为。)

[Source]

由于字符类不允许反向引用,因此在字符类中重新使用反斜杠后跟数字:

  

反斜杠后跟两个或三个八进制数字被视为八进制数字。

[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”和$4中的“2”包含“1”,但您必须搜索1到20的捕获,以查找每次是否匹配任何内容。

对正则表达式结果进行后处理的唯一方法是使用正则表达式条件:(?(A)X)其中A是条件,X是结果操作。

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]

因此,您的问题的答案是:“不,您不能使用Google Analytics使用的RE2 执行此操作,但是您可以使用Perl正则表达式执行此操作。”