Регулярное выражение как сопоставить необязательный символ


у меня есть регулярное выражение, которое я думал, что работает правильно до сих пор. Мне нужно соответствовать на необязательный символ. Он может быть там, а может и нет.

вот две строки. Верхняя строка сопоставляется, а нижняя-нет. Отсутствие одной буквы в нижней строке, что делает его ошибкой.

Я хотел бы получить одну букву после стартовых 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})/
3 77

3 ответа:

использовать

[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 отдельных групп захвата? И если да, то почему бы вам не захватить четвертую-последнюю группу цифры?

вы можете сделать одну букву необязательной, добавив ? после того как:

([A-Z]{1}?)

квантором {1} является избыточным, так что вы можете отказаться от него.

вы также должны отметить одну букву как необязательную:

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

или сделать всю часть дополнительно

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