Регулярное выражение для соответствия цифре два или четыре раза

96

Это простой вопрос о регулярных выражениях, но я не нахожу ответа.

Я хочу определить, появляется ли число последовательно два или четыре раза. Какой синтаксис я могу использовать?

\d{what goes here?}

Я пробовал \d{2,4}, но это выражение тоже принимает три цифры.

Ренато Динхани
источник
1
Например, чтобы соответствовать двух- или четырехзначный год .
DavidRR
Что вы хотите сделать, если строка есть abc 123 xyz? Должен ли он совпадать, 12потому что это ровно две цифры подряд? Или нет, потому что 12это часть более крупной последовательности цифр, 123которая сама по себе не имеет длины ни 2, ни 4? Если бы мне пришлось угадывать, я бы подумал, что вы хотите последнее поведение, но это не ясно из вашего вопроса. Примеры и / или более четкое описание могут помочь. Тот же вопрос для abc 12345 def... что там должно происходить?
Жан-Франсуа Корбетт,

Ответы:

148

Для этого нет специального синтаксиса, но есть много способов сделать это:

(?:\d{4}|\d{2})    <-- alternation: four digits or two
\d{2}(?:\d{2})?    <-- two digits, and optionally two more
(?:\d{2}){1,2}     <-- two digits, times one or two
руах
источник
1
Лично я подумал о \d{2}(?:\d{2})?решении сразу же - хорошее их разнообразие - последнее, в частности, казалось очень красивым и масштабируемым.
Nightfirecat
3
+1 за то, что нужно помнить о порядке, необходимом при использовании чередования, чтобы сначала сопоставить 4 цифры, а затем 2 цифры. Также хорошая работа с другими вариантами.
Ахмад Магид
9
Для тех, кто, как и я, не понимал, как это использовать, (?:запускает «группу без захвата» (группу, на которую не следует ссылаться в операторе замены). Вы также можете просто использовать скобки, но это создаст группу захвата. Более подробная информация здесь: stackoverflow.com/questions/3512471/non-capturing-group
Джереми Мориц
Они покажут одинаковый результат для «333» и «33»
Дан
1
@Dan: эти регулярные выражения не соответствуют полной строке "333". Возможно, вы по ошибке используете функцию «найти соответствующую подстроку» в своей библиотеке регулярных выражений, а не ее функцию «проверка совпадения полной строки». Вам следует ознакомиться с его документацией.
ruakh 01
3
(?<!\d)(\d{2}|\d{4})(?!\d)

Это правильный способ сделать это. Принятый ответ неверен.

Он будет соответствовать 3 цифрам (или 5). Так что это неправильно в моих глазах .

1) Убедитесь, что перед последовательностью из 2 или 4 цифр, а также после последовательности из двух или четырех цифр нет цифр.

  • (<!) синтаксис - отрицательный взгляд назад

  • (?!) синтаксис - отрицательный взгляд вперед.

Вышеупомянутое будет работать для средней строки:

Если строка поиска не имеет никакого содержания вокруг него вы могли бы использовать ^и $начала и конца строки якорей:

^\d{4}$|^\d{2}$
JGFMK
источник
1
Я бы не сказал, что принятый ответ неверен. Я бы сказал, что вопрос неясен и что этот ответ относится к одной действительной его интерпретации. Ваш ответ относится к другой действительной интерпретации (которая, как мне кажется, более вероятна, но, очевидно, спрашивающий не ...).
Жан-Франсуа Корбетт,
2
«Это соответствует 3 цифрам» не совсем точно. Я думаю, вы имеете в виду: «Это будет соответствовать 2-значной подпоследовательности 3-значной последовательности».
Жан-Франсуа Корбетт,
1
Кроме того, ваш ответ не совсем подходит для последовательностей из 5 или более цифр . Я не эксперт по регулярным выражениям, но я думаю, что один из способов исправить это - применить отрицательный взгляд вперед / назад к обоим случаям (2- и 4-значные последовательности):(?<!\d)(\d{2}|\d{4})(?!\d)
Жан-Франсуа Корбетт,
Я думаю, вы правы насчет 5 цифр. Спасибо за исправление. Исправлю это.
JGFMK
^\d{4}$|^\d{2}$было бы потенциальным способом исправить это. Как бы^\d{2}(?!\d)|^\d{4}(?!\d)
JGFMK