代码之家  ›  专栏  ›  技术社区  ›  davecardwell

在重复构造中使用regex back引用(n)

  •  4
  • davecardwell  · 技术社区  · 14 年前

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

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

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

    例如,在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 回复  |  直到 14 年前
        1
  •  2
  •   Tim Pietzcker    14 年前

    正则表达式无法计算,因此不能只使用regex进行计算。

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