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