Регулярные выражения: совпадение x раз OR y раз
Позволяет сказать, что мне нужно сопоставить шаблон, если он появляется 3 или 6 раз подряд. Самое близкое, что я могу получить, это что-то вроде \d {3,6}, но это не совсем то, что мне нужно.
'123' должно соответствовать
"123456" должен соответствовать |
'1234' не должен соответствовать
Ответы
Ответ 1
^(\d{3}|\d{6})$
У вас должен быть какой-то терминатор, иначе \d{3}
будет соответствовать 1234. Вот почему я ставлю ^ и $выше. Один из вариантов - использовать образы:
(?<!\d)(\d{3}|\d{6})(?!\d)
чтобы убедиться, что ему не предшествует цифра (или в этом случае). Подробнее в Утверждения нулевой ширины Lookahead и Lookbehind.
Ответ 2
Как насчет:
(\d\d\d){1,2}
хотя вам также понадобятся охранники с любого конца, которые зависят от вашего механизма RE, что-то вроде:
[^\d](\d\d\d){1,2}[^\d]
или
^(\d\d\d){1,2}$
Ответ 3
Первый соответствует 3, 6, а также 9, 12, 15,.... Второй выглядит правильно. Вот еще один поворот:
\d{3}\d{3}?
Ответ 4
Для этого случая мы можем избежать этого хитрого метода:
Чистая реализация
/(\d{3}){1,2}/
/(?:\d{3}){1,2}/
Как?!
Это работает, потому что мы ищем кратные три, которые являются последовательными в этом случае.
Примечание. Для этого случая нет причин для захвата группы, поэтому я добавляю флаг группы ?:
Non capture в группу захвата.
Это похоже на реализацию paxdiablo
, но немного чище.
Соответствие Hex
Я делал что-то похожее для сопоставления с основными шестнадцатеричными цветами, так как они могли иметь длину 3 или 6. Это позволило мне сохранить мой шестнадцатеричный цвет, соответствующий DRY'd, т.е.
/^0x(?:[\da-f]{3}){1,2}$/i