8

помогите переделать регулярку для парсинга 9-и значного автомобильного номера (для 8-и значного нашел)

формат 8-и значного: аХХХааХХ

формат 9-и значного: аХХХааХХХ

Где а - буквы русского алфавита, Х - цифры

Для 8-и значного:

/^[а-яё\-\s]{1}[0-9]{3}(?<!0{3})[а-яё\-\s]{2}[0-9]{2}$/
  • 1
    Замените [0-9]{2}$ на [0-9]{3}$ или [0-9]{2,3}$ (если требуется поддержка обоих форматов). Это для PHP? А верно, что первые три цифры не должны быть нулями? – Wiktor Stribiżew May 08 '18 at 08:37
  • 2
    А еще не забудьте про номера такси и транспорта, там на 1 букву меньше и порядок чуть другой. – Kromster May 08 '18 at 08:40
  • 1
    И не забывайте, что в номерах встречаются далеко не все буквы русского алфавита. Буквы "я", например, нет. – Эникейщик May 08 '18 at 08:44
  • 3
    а если быть точным, то всего 12 букв: АВЕКМНОРСТУХ. – Fat-Zer May 08 '18 at 08:47
  • 1
    У - единственная буква, по которой можно понять, что это действительно кириллица) – vp_arth May 08 '18 at 08:48

3 Answers3

14

В общем, с учётом вышесказанного в комментариях, регулярка для 8/9 может выглядеть так:

/^[АВЕКМНОРСТУХ]\d{3}(?<!000)[АВЕКМНОРСТУХ]{2}\d{2,3}$/ui

Ну и да, стоит уточнить, что это работает только для номеров частных транспортных средств.

Существуют также:

  • транспорт/такси: /^[АВЕКМНОРСТУХ]{2}\d{3}(?<!000)\d{2,3}$/ui
  • прицепы: /^[АВЕКМНОРСТУХ]{2}\d{4}(?<!0000)\d{2,3}$/ui
  • мото, c/х техника: /^\d{4}(?<!0000)[АВЕКМНОРСТУХ]{2}\d{2,3}$/ui
  • транзит: /^[АВЕКМНОРСТУХ]{2}\d{3}(?<!000)[АВЕКМНОРСТУХ]\d{2,3}$/ui
  • выездные: /^Т[АВЕКМНОРСТУХ]{2}\d{3}(?<!000)\d{2,3}$/ui

Ещё есть МВД, дипломаты, военные, федеральные(без региона)...

vp_arth
  • 27,179
  • 1
    Вообще-то первые 3 цифры не могут быть 000, но могут быть 001, 010 и т.д. – Wiktor Stribiżew May 08 '18 at 08:53
  • Да, с регионами тоже всё видимо непросто) можно что-то вроде [017]?\d{2} влепить – vp_arth May 08 '18 at 08:56
  • а для не-автомобилей трёхциферные регионы используются? – Fat-Zer May 08 '18 at 09:13
  • Не уверен, но почему бы и нет? Мало ли.. – vp_arth May 08 '18 at 09:21
  • А ещё, очень редко, раз-два в год, но на дорогах все же встречаются машины с номерами советского формата: XX-XX aaa и aXXXXaa. – Yaant May 08 '18 at 10:18
5

Делал себе для определения соответствия российским ГРЗ.

/(([АВЕКМНОРСТУХ]\d{3}[АВЕКМНОРСТУХ]{1,2})(\d{2,3})|(\d{4}[АВЕКМНОРСТУХ]{2})(\d{2})|(\d{3}C?D{1,2}\d{3})(\d{2})|([АВЕКМНОРСТУХ]{2}\d{3}[АВЕКМНОРСТУХ])(\d{2})|([АВЕКМНОРСТУХ]\d{4})(\d{2})|(\d{3}[АВЕКМНОРСТУХ])(\d{2})|(\d{4}[АВЕКМНОРСТУХ])(\d{2}))/i
pawman
  • 3
1

А еще можно вместо проверки госномера на соответствие формату попробовать автоматически исправлять ошибки ручного ввода госномера пользователем.

Я написал на python библиотечку gosnomer - попробуйте, может, это именно то, что нужно вашему проекту?

  • Данный вопрос о регулярных выражениях. Как относится к нему или отвечает на него ваше сообщение? – 0xdb Jul 13 '20 at 20:39
  • А мне показалось, что вопрос не только о регулярных выражениях, но еще и о решении прикладной задачи, касающейся правильности подаваемых пользователем автомобильных номеров. – Alexey Leshchenko Jul 14 '20 at 09:40
  • Регулярное выражение для русского автомобильного номера - всё после "для" автор мог спокойно опустить, т.к. требуемый формат приведён в вопросе, а для чего он нужен особой роли не играет. – 0xdb Jul 14 '20 at 10:19