我想匹配一个数字等于或高于捕获组中数字的字符串。
示例:
> (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
,但这不起作用。是否可以使用正则表达式来实现这一目标?
答案 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})(?!))/
因此,您的问题的答案是:“不,您不能使用Google Analytics使用的RE2 执行此操作,但是您可以使用Perl正则表达式执行此操作。”