Регулярное выражение проверки VIN

Я написал регулярное выражение проверки VIN на основе http://en.wikipedia.org/wiki/Vehicle_identification_number но тогда, когда я пытаюсь запустить некоторые тесты, он не принимает некоторые допустимые номера VIN.

Мое Регулярное Выражение:

^[A-HJ-NPR-Za-hj-npr-zd]{8}[dX][A-HJ-NPR-Za-hj-npr-zd]{2}d{6}$

номер VIN не работает:
1ftfw1et4bfc45903
WP0ZZZ99ZTS392124

рабочие номера VIN:
19uya31581l000000
1hwa31aa5ae006086

(Я думаю, что проблема происходит с числами в конце, Википедия заставила его звучать так, как будто он закончится только 6 числами, а тот, который не работает, но является допустимым числом, заканчивается только 5)

любая помощь в исправлении этой проблемы будет очень признательна!

6 ответов


Я не могу помочь вам с идеальным регулярным выражением для VIN-чисел - но я can объясните, почему это не удается в вашем примере 1ftfw1et4bfc45903:

  • ^[A-HJ-NPR-Za-hj-npr-z\d]{8}
    Это позволяет использовать 8 символов, состоящих из любых цифр и любых букв, кроме Я, O и Q; он правильно находит первые 8 символов:
    1ftfw1et
  • [\dX]
    Это позволяет за 1 символ, либо цифра, либо заглавная X; он правильно находит следующий символ:
    4
  • [A-HJ-NPR-Za-hj-npr-z\d]{2}
    Это позволяет использовать 2 символа, состоящих из любых цифр и любых букв, кроме I, O и Q; он правильно находит следующие 2 символа:
    bf
  • \d{6}$
    Это позволяет использовать ровно 6 цифр и является причиной сбоя регулярного выражения; потому что последние 6 символов-это не все цифры:
    c45903

вин только A-Z, 0-9 символы, но не I, O или Q
Последние 6 символов вин должно быть число
вин должна быть 17 символов

вы не указали, какой язык вы используете, но следующее регулярное выражение может использоваться для проверить американский VIN С php:

/^(?:([A-HJ-NPR-Z]){3}|\d{3})(?1){2}\d{2}(?:(?1)|\d)(?:\d|X)(?:(?1)+\d+|\d+(?1)+)\d{6}$/i

это регулярное выражение отлично работает для проверки Us VINs, включая тот, который вы описали:

[A-HJ-NPR-Z0-9]{17}

Не забудьте сделать его нечувствительным к регистру с флагом i

источник:https://github.com/rfink/angular-vin


Я чувствую, что регулярное выражение не является идеальной проверкой. VINs имеют встроенную контрольную цифру. https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_ (VIN_codes) / Check_digit или http://www.vsource.org/VFR-RVF_files/BVINcalc.htm

Я предлагаю вам построить алгоритм, с помощью этого. (непроверенные пример алгоритма)


Это должно работать, это из поиска splunk, поэтому есть некоторые дополнительные исключения**

(?i)(?<VIN>[A-Z0-9^IOQioq_]{11}\d{6})

Дэн прав - VINs имеют контрольную сумму. Вы не можете использовать это в regex, поэтому лучшее, что вы можете сделать с регулярным выражением, - это слишком широкая сеть. под этим я подразумеваю, что ваше регулярное выражение будет принимать все действительные VIN, а также около триллиона (грубая оценка) не-VIN 17-символьных строк.

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

Итак, если ваша цель:

  • только не отклонять допустимые VINs (впуск недопустимых-это нормально) тогда используйте ответ Франсиско,[A-HJ-NPR-Z0-9]{17}.

  • не отклонять действительные VINs и захватывать информацию, такую как модельный год, код завода и т. д., а затем использовать это (обратите внимание, вы должны использовать язык, который может поддерживать именованные группы захвата-с верхней части моей головы: Perl, Python, Elixir, почти наверняка другие, но не JS):/^(?<wmi>[A-HJ-NPR-Z\d]{3})(?<vds>[A-HJ-NPR-Z\d]{5})(?<check>[\dX])(?<vis>(?<year>[A-HJ-NPR-Z\d])(?<plant>[A-HJ-NPR-Z\d])(?<seq>[A-HJ-NPR-Z\d]{6}))$/ где имена определены в конце этого ответа.

  • не отвергать действительные VINs и prevent некоторые, но не все недействительные VINs, вы можете получить конкретные, как Педро делает.

  • только принять действительные VINs: вам нужно написать код (просто шучу,GitHub существует).

имя группы захвата ключ:

  • wmi - мировой идентификатор производителя
  • vds - раздел описания транспортного средства
  • check - проверить цифра
  • vis - раздел идентификатора транспортного средства
  • year - год выпуска
  • plant - завод код
  • seq - серийный номер