2009-05-15 7 views
16

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

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

ответ

26
^(\d{3}|\d{6})$ 

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

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

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

+0

Это выглядит хорошо, спасибо. Но что, если шаблон намного больше, чем просто \ d? Думаю, я мог бы сделать некоторую строчную интерполяцию при создании регулярного выражения, но есть ли лучший способ повторного использования под-шаблонов? – 2009-05-15 00:46:29

+0

В этом случае вы хотели бы использовать формат {1,2}, т. Е. (() {3}) {1,2} –

5

Как насчет:

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

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

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

или:

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

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

\d{3}\d{3}? 
+6

Первое и второе? Если вы имеете в виду чужой ответ, вы должны сказать, какой он есть. Эти ответы не всегда появляются в одном порядке. –

Смежные вопросы