Использование обратной ссылки Regex в структуре повторения ({N}) - PullRequest
4 голосов
/ 04 августа 2010

Мне нужно сопоставить строку с префиксом приемлемой длины для этой строки.

Например, {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 Ответ

2 голосов
/ 04 августа 2010

Регулярные выражения не могут быть вычислены, поэтому вы не можете сделать это только с регулярным выражением.

Вы можете сопоставить строку с /^\{(\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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...