Регулярное выражение как сопоставить необязательный символ
у меня есть регулярное выражение, которое я думал, что работает правильно до сих пор. Мне нужно соответствовать на необязательный символ. Он может быть там, а может и нет.
вот две строки. Верхняя строка сопоставляется, а нижняя-нет. Отсутствие одной буквы в нижней строке, что делает его ошибкой.
Я хотел бы получить одну букву после стартовых 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 ответа:
использовать
[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 отдельных групп захвата? И если да, то почему бы вам не захватить четвертую-последнюю группу цифры?