Регулярное выражение проверки 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
- серийный номер