Подтвердить что ты не робот

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})/
4b9b3361

Ответ 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 соответствует желаемому.