Регулярний вираз для відповідності цифри два-чотири рази


95

Це просте запитання щодо регулярних виразів, але я не знаходжу відповіді.

Я хочу , щоб визначити , чи буде відображатися номер в послідовності рівно два або чотири рази. Який синтаксис я можу використовувати?

\d{what goes here?}

Я спробував \d{2,4}, але цей вираз також приймає три цифри.


1
Наприклад, для відповідності дво- або чотиризначному році .
DavidRR

Що ви хочете, щоб сталося, якщо рядок є abc 123 xyz? Чи повинен він збігатися, 12оскільки це рівно дві цифри в послідовності? Або ні, бо 12це частина більшої послідовності цифр, 123яка сама не має ні 2, ні 4? Якби мені довелося здогадуватися, я б подумав, що ви хочете останньої поведінки, але з вашого запитання це не зрозуміло. Приклади та / або більш чітка специфікація допомогли б. Те саме питання для abc 12345 def... що там має статися?
Жан-Франсуа Корбетт,

Відповіді:


146

Для цього немає конкретного синтаксису, але існує безліч способів це зробити:

(?:\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
Для тих, хто, як і я, не розумів використання (?:цього, починається "група, яка не фіксує" (група, на яку не передбачено посилання в операторі replace). Ви також можете просто використовувати панелі, але вони створять групу захоплення. Детальніше тут: stackoverflow.com/questions/3512471/non-capturing-group
Jeremy Moritz

Вони покажуть однаковий результат для "333" і "33"
Дан,

1
@Dan: Ці регулярні вирази не відповідають повному рядку "333". Можливо, ви використовуєте функцію бібліотеки регулярних виразів "знайти відповідний підрядок" помилково, а не її функцію "перевірити, чи збігається повний рядок". Вам слід ознайомитися з його документацією.
ruahh

3
(?<!\d)(\d{2}|\d{4})(?!\d)

Це правильний спосіб зробити це. Прийнята відповідь неправильна.

Він відповідав би 3 цифрам (або 5). Тож це неправильно в моїх очах .

1) Перевірте, чи немає цифр перед послідовністю з 2, або 4 цифр, або після послідовності з двох або чотирьох цифр.

  • (<!) синтаксис негативний

  • (?!) синтаксис від'ємний.

Вищевказане буде працювати для середнього рядка:

Якщо у вашому пошуковому рядку немає вмісту навколо, ви можете використовувати якорі рядків ^і $початок, і кінець:

^\d{4}$|^\d{2}$

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.