Regex, как сопоставить необязательный символ - PullRequest
105 голосов
/ 24 октября 2010

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

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

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

Ответы [ 4 ]

188 голосов
/ 24 октября 2010

Используйте

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

17 голосов
/ 24 октября 2010

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

([A-Z]{1}?)

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

6 голосов
/ 24 октября 2010

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

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

или сделать всю часть необязательной

(([A-Z]{1}) +.*? +)?
0 голосов
/ 06 февраля 2019

Вы также можете использовать более простое регулярное выражение, разработанное для вашего случая, например (.*)\/(([^\?\n\r])*), где $2 соответствует тому, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...