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

时间:2010-08-04 16:35:40

标签: regex

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

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

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

例如,在JavaScript中,它返回true:

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

虽然这会返回false:

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

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

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

1 个答案:

答案 0 :(得分:2)

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

您可以将字符串与/^\{(\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