регулярные выражения: соответствуют x раз или y раз - PullRequest
19 голосов
/ 15 мая 2009

Допустим, мне нужно сопоставить шаблон, если он появляется 3 или 6 раз подряд. Самое близкое, что я могу получить, это что-то вроде \ d {3,6}, но это не совсем то, что мне нужно.

'123' должно соответствовать
«123456» должно соответствовать
«1234» не должно совпадать

Ответы [ 3 ]

31 голосов
/ 15 мая 2009
^(\d{3}|\d{6})$

Вы должны иметь какой-то терминатор, иначе \d{3} будет соответствовать 1234. Вот почему я поставил ^ и $ выше. Одна альтернатива - использовать обходные пути:

(?<!\d)(\d{3}|\d{6})(?!\d)

, чтобы убедиться, что перед ним не стоит и не следует цифра (в данном случае). Подробнее в Утверждения Lookahead и Lookbehind Zero-Width .

11 голосов
/ 15 мая 2009

Как насчет:

(\d\d\d){1,2}

хотя вам также понадобятся охранники на обоих концах, которые зависят от вашего двигателя RE, что-то вроде:

[^\d](\d\d\d){1,2}[^\d]

или

^(\d\d\d){1,2}$
1 голос
/ 15 мая 2009

Первый соответствует 3, 6, но также 9, 12, 15, .... Второй выглядит правильно. Вот еще один поворот:

\d{3}\d{3}?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...