2010-08-04 64 views
4

我需要匹配以该字符串的可接受长度为前缀的字符串。在重复构造中使用正则表达式返回引用({N})

例如,{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")

回答

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 
+0

啊,我想尽可能多。感谢您确认我的怀疑。 – davecardwell 2010-08-06 13:29:53