Подтвердить что ты не робот

Регулярные выражения: совпадение x раз OR y раз

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

'123' должно соответствовать "123456" должен соответствовать | '1234' не должен соответствовать

4b9b3361

Ответ 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