JavaScript Regex: сложная проверка ввода - PullRequest
2 голосов
/ 16 июня 2010

Я пытаюсь создать регулярное выражение для проверки действительных номеров деталей и / или серийных номеров в сочетании с диапазонами.

Допустимый номер детали - это две буквы, трехзначный шаблон или / [Az] {2} \ d {3} /

i.e. aa123 or ZZ443 etc...

Действительный серийный номер - это пятизначный шаблонили / \ d {5} /

13245 or 31234 and so on.

Эта часть не проблема.Я хочу, чтобы комбинации и диапазоны были также действительны:

12345, ab123,ab234-ab245, 12346 - 12349 - конечная цель.Диапазоны и / или серийных номеров и / или серийных номеров в любой комбинации.Обратите внимание, что пробелы необязательны при указании диапазона или после запятой в ряду.Обратите внимание, что диапазон номеров деталей имеет одинаковую двухбуквенную комбинацию с обеих сторон диапазона (т. Е. ab 123 - ab 239)

Я боролся сэто выражение уже два дня, и ничего лучше, чем это, не придумал:

/^(?:[A-z]{2}\d{3}[, ]*)|(?:\d{5}[, ]*)|(?:([A-z]{2})\d{3} ?- ?\4\d{3}[, ]*)|(?:\d{5} ?- ?\d{5}[, ]*)$/

...

У меня слабое регулярное выражение.

Ответы [ 2 ]

1 голос
/ 16 июня 2010

Во-первых, [A-z] не так.В дополнение к буквам, он будет соответствовать квадратной скобке, обратной косой черте, каретке, подчеркиванию или обратному символу - всем символам, которые лежат между прописными и строчными буквами в наборе символов ASCII.Вы должны использовать либо [A-Za-z], либо [A-Z] с учетом регистра без учета регистра.

Чтобы сопоставить один или несколько серийных номеров, выполните следующие действия:

/\d{5}(?:\s*-\s*\d{5})?/

... и для номеров деталей:

/([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?/i

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

Соединяя это вместе, чтобы соответствовать целой серии, у вас есть

/(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+/i

Запятая должна быть необязательной, но это означает, что регулярное выражение может неправильно соответствовать последовательности, такой как 1234512345 или 12345ab123.Вряд ли это произойдет, я добавил слово border (\b), чтобы покрыть его.Между двумя серийными / серийными номерами / диапазонами должен быть хотя бы один несловичный символ, а (?:,\s*)? означает, что это может быть только запятая и необязательный пробел.Ваш [, ]* позволит использовать любое количество пробелов и / или запятых или вообще ничего.

1 голос
/ 16 июня 2010

Возможно, вы не захотите делать все это с помощью регулярных выражений. Если у вас есть только список разделенных запятыми номеров деталей / серийных номеров, которые необязательно являются диапазонами, это может быть проще:

split input on commas
for each input:
   if there is a dash:
       split on a dash, strip each element to remove whitespace
       make sure each side is a part or a serial number (can use 2 regexes here)
       if they're part numbers, make sure they start w/ the same two letters
   else:
       strip to remove whitespace, make sure is a valid part or serial number

Если все проходит, то ввод правильный.

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