Regex, как совместить необязательный символ
У меня есть регулярное выражение, которое, как я думал, работает правильно до сих пор. Мне нужно сопоставить необязательный символ. Он может быть там, или может не быть.
Вот две строки. Верхняя строка сопоставляется, а нижняя - нет. Отсутствие единственной буквы в нижней строке - это то, что делает ее неудачной.
Я хотел бы получить одно письмо после стартовых 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})/
Ответы
Ответ 1
Использование
[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})
И, поскольку в большинстве диалектов regex, \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 отдельных групп захвата? И если да, почему бы вам не взять четвертую-последнюю группу цифр?
Ответ 2
Вы можете сделать одну букву необязательной, добавив ?
после нее как:
([A-Z]{1}?)
Квантификатор {1}
является избыточным, поэтому вы можете его удалить.
Ответ 3
Вы также должны отметить одну букву как необязательную:
([A-Z]{1})? +.*? +
или сделать полную часть необязательной
(([A-Z]{1}) +.*? +)?
Ответ 4
Вы также можете использовать более простое регулярное выражение, разработанное для вашего случая, например (.*)\/(([^\?\n\r])*)
где $2
соответствует желаемому.