Регулярное выражение для сопоставления с набором произвольных кодов - PullRequest
0 голосов
/ 04 июня 2009

Мне нужна помощь в создании регулярного выражения, которое работало бы с уникальным входом в нашей системе. У нас уже есть некоторая логика в нашем событии нажатия клавиш, которая будет позволять только цифры и разрешить букву A и букву M. Теперь мне нужно придумать RegEx, который может соответствовать вводу во время события onblur, чтобы обеспечить формат правильно.

У меня есть несколько примеров того, что будет правильным. Буква A обозначает возраст, поэтому за ней всегда следует до 3 цифр. Буква М может встречаться только в конце строки.

Допустимый ввод

1-М
10-М
100-М
5-7
5-20
5-100
10-20
10-100
A5-7
A10-7
A100-7
A10-20
A5-A7
A10-A20
A10-A100
A100-A102

Неверный ввод

а-а
a45
4

Ответы [ 6 ]

2 голосов
/ 04 июня 2009

Используйте метод грубой силы, если у вас есть небольшое количество четко определенных шаблонов, поэтому вы не получите плохих угловых совпадений:

^(\d+-M|\d+-\d+|A\d+-\d+|A\d+-A\d+)$

Здесь приведены отдельные регулярные выражения:

\d+-M      <- matches anything like '1-M'
\d+-\d+    <- 5-7
A\d+-\d+   <- A5-7
A\d+-A\d+  <- A10-A20
2 голосов
/ 04 июня 2009

Это соответствует всем образцам.

/A?\d{1,3}-A?\d{0,3}M?/

Не уверен, если 10-A10M должен или не должен быть законным или даже если M может появиться с числами. Если это М только там без номеров:

/A?\d{1,3}-(A?\d{1,3}|M)/
2 голосов
/ 04 июня 2009
/^[A]?[0-9]{1,3}-[A]?[0-9]{1,3}[M]?$/

Соответствует любому виду:

A(optional)[1-3 numbers]-A(optional)[1-3 numbers]M(optional)
1 голос
/ 04 июня 2009
^A?\d{1,3}-(M|A?\d{1,3})$

^ - совпадение должно быть сделано с начала
A? - «А» является необязательным
\ d {1,3} - от 1 до 3 цифр; [0-9] {1,3} также работает
- - Символ "-"
(... | ...) - Либо одно из двух выражений
(M | ...) - Либо "M", либо ...
(... | A? \ D {1,3}) - "A", за которым следуют не менее одной и не более трех цифр
$ - матч должен быть завершен до конца

Некоторые последствия смены формата. Если вы не поставите «^» в начале, совпадение может игнорировать недопустимое начало. Например, «MAAMA0-M» будет соответствовать «A0-M».

Если вы также пропустите $ out, совпадение может игнорировать неверный след. Например, «A0-MMMMAAMAM» будет соответствовать «A0-M».

Обычно предпочтительнее использовать \ d, как \ w для буквенно-цифровых символов, \ s для пробелов, \ D для не цифр, \ W для не алфавитно-цифровых или \ S для не пробелов. Но вы должны быть осторожны, чтобы \ d не рассматривалось как escape-последовательность. Возможно, вам придется написать это \\ d вместо этого.

{x, y} означает, что последнее совпадение должно быть между x и y разами.

? означает, что последнее совпадение должно произойти один раз или не произойти вовсе

При использовании () он рассматривается как одно совпадение. (ABC)? будет соответствовать ABC или вообще ничего.

1 голос
/ 04 июня 2009
^A?\d+-(?:A?\d+|M)$

Необязательный A, за которым следуют одна или несколько цифр, тире и либо еще одна необязательная A и несколько цифр, либо M. Обозначение '(?: ... )' представляет собой Perl 'не захватывающий' набор скобок вокруг альтернатив; это означает, что после совпадения с регулярным выражением не будет '$1'. Ясно, что если вы хотите захватить различные фрагменты, вы могли бы - и сделаете - так, и предложение об отсутствии захвата может быть неактуальным.

(Вы можете заменить '+' на '{1,3}', как это сделал JasonV, чтобы ограничить число 3 цифрами.)

0 голосов
/ 04 июня 2009

Я бы использовал это регулярное выражение:

^(?:[1-9]\d{0,2}-(?:M|[1-9]\d{0,2})|A[1-9]\d{0,2}-A?[1-9]\d{0,2})$

Это соответствует либо:

  • <number>-M или <number>-<number>
  • A<number>-<number> или A<number>-A<number>

Дополнительно <number> не должно начинаться с 0.

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