在重复结构中使用正则表达式反向引用 ({N})

dav*_*ell 5 regex

我需要匹配一个以该字符串可接受长度为前缀的字符串。

例如,{3}abc将匹配,因为该abc部分是3字符长。{3}abcd会因为失败abcd 3长的字符。

我会使用^\{(\d+)\}.{\1}$N在花括号内捕获一个数字,然后是任何字符N时间),但似乎重复构造中的值必须是一个数字(或者至少,它不会接受反向引用)。

例如,在 JavaScript 中这会返回 true:

/^\{(\d+)\}.{3}$/.test("{3}abc")

虽然这返回假:

/^\{(\d+)\}.{\1}$/.test("{3}abc")

这是否可以在单个正则表达式中完成,或者我是否需要将其分为两个阶段,例如:

/^\{(\d+)\}/.test("{3}abc") && RegExp("^\\{" + RegExp.$1 + "\\}.{" + RegExp.$1 + "}$").test("{3}abc")

Tim*_*ker 4

正则表达式无法计算,因此不能仅使用正则表达式来执行此操作。

您可以将字符串与 相匹配/^\{(\d+)\}(.*)$/,然后检查是否为len($2)==int($1)

以Python为例:

>>> import re
>>> t1 = "{3}abc"
>>> t2 = "{3}abcd"
>>> r = re.compile(r"^\{(\d+)\}(.*)$")
>>> m1 = r.match(t1)
>>> m2 = r.match(t2)
>>> len(m1.group(2)) == int(m1.group(1))
True
>>> len(m2.group(2)) == int(m2.group(1))
False
Run Code Online (Sandbox Code Playgroud)