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

Fri*_*nsh 5 regex google-analytics

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

例:

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

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

Jon*_*Mee 3

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

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

[来源]

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

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

[来源]

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

如果我们希望完全在正则表达式中完成此操作,我们无法枚举所有可能的组合,因为我们必须检查所有捕获以找出匹配的组合。例如

"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))/
Run Code Online (Sandbox Code Playgroud)

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


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

遗憾的是 RE2 不支持条件,但我们将继续努力证明它是可以做到的。

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

您想要使用的是A?{$1 > $2}只有 Perl 允许您直接在正则表达式中使用代码。Perl 允许您使用:

m/(\d)x(\d)(?(?{$1 > $2})(?!))/
Run Code Online (Sandbox Code Playgroud)

[实例]

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