Regex, як відповідати необов'язковому символу


147

У мене є регулярний вираз, який я вважав, що працює до цього часу правильно. Мені потрібно відповідати за необов’язковим символом. Він може бути там, а може і не бути.

Ось дві струни. Верхня рядок збігається, а нижня - ні. Відсутність однієї літери в нижньому рядку - це те, що робить її невдалою.

Я хотів би отримати одну букву після початкових 5 цифр, якщо вона є, а якщо ні, продовжуйте отримувати решту рядка. Цей лист може бути A-Z.

Якщо я вийму ([A-Z]{1}) +.*? +з регулярної виразки, вона відповідатиме всім, що мені потрібно, окрім листа, але це важливо.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

Ось регекс, який я використовую.

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

Відповіді:


246

Використовуйте

[A-Z]?

щоб зробити лист необов’язковим. {1}є зайвим. (Звичайно, ви також можете написати, [A-Z]{0,1}що означало б те саме, але для цього ?є.)

Ви можете вдосконалити свій регулярний вираз

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

Оскільки, у більшості діалектних регексів, \dце те саме, що [0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

Але: чи вам справді потрібно 11 окремих груп захоплення? І якщо так, то чому б ви не захопили четверту до останньої групи цифр?


Тім, я, чесно кажучи, не впевнений, оскільки не написав цього регексу. Я все ще досить новачок у регексе. Якщо ви бачите кращий спосіб писати це, я відкритий для пропозицій.
Джим

1
Тіме, твій приклад працює для обох рядків, будь я в цьому положенні чи ні. Дякую.
Джим

26

Ви можете зробити одну букву необов’язковою, додавши ?після неї як:

([A-Z]{1}?)

Кількісний коефіцієнт {1}є зайвим, тому його можна скинути.


Дякую кодексу. Чи займає знак питання місце знака `+. *? + `?
Джим

Під час використання греп-регексу ви отримаєте помилку, якщо скинете {1} (grep: погляд за твердженням не має фіксованої довжини). Тож це справа про те, щоб залишити його.
Zunderscore

6

Ви також повинні позначати одну букву як необов'язкову:

([A-Z]{1})? +.*? +

або зробити всю деталь необов’язковою

(([A-Z]{1}) +.*? +)?

1
Стефане, я хотів би зробити лист абсолютно необов’язковим. Я спробував обидва, але все ще нічого не відповідає. Я впевнений, що помилився. Чи можете ви змінити свій приклад, щоб включити його до рядка?
Джим

0

Ви також можете використати простіший регулярний вираз, призначений для вашого випадку, наприклад, (.*)\/(([^\?\n\r])*)де $2відповідають тому, що ви хочете.

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