2013-12-05 5 views
4

У меня есть строка в формате A123ABCРегулярного выражения для A123ABC

  • Первая буква может не содержать <I,O,Q,U,Z>
  • Далее 3 цифры (0-9) от 21-998
  • Последних 3 буквы не может включать в себя <I,Q,Z>

я использовал следующее выражение [A-HJ-NPR-TV-Y]{1}[0-9]{2,3}[A-HJ-PR-Y]{3}

Но я не могу ограничить число в диапазоне 21-998.

+0

, пожалуйста, введите строку ввода –

+1

Разрешено ли '021'? – SQB

+2

Честно говоря, это звучит как плохая проблема с приближением к регулярному выражению; если вы разделите строку на три части (буква, цифры, буквы), вы можете легко проверить их отдельно. – Nightfirecat

ответ

4

Ваше письмо часть штрафа, ниже только номера части:

regex = "(?:2[1-9]|[3-9][0-9]|[1-8][0-9][0-9]|9[0-8][0-9]|99[0-8])" 

(?:...) группа, но не захватывать.
2[1-9] охватывает 21-29
[3-9][0-9] охватывает 30-99
[1-8][0-9][0-9] охватывает 100-899
9[0-8][0-9] охватывает 900-989
99[0-8] охватывает 990-998
| означает "или"

Примечание: [0-9] могут быть заменены на \d. Таким образом, более краткое представление будет:

regex = "(?:2\d|[3-9]\d|[1-8]\d{2}|9[0-8]\d|99[0-8])" 
+2

Дополнительная '' ['' в конце – nrathaus

+0

@nrathaus Спасибо. –

+0

Это не будет соответствовать 899, что должно быть разрешено. – SQB

2

Предполагая, что число между 21 и 99 отображаются с тремя цифрами (например:. 021, 055, 099), вот решение для числа части:

((02[1-9])|(0[3-9][0-9])|([1-8][0-9]{2})|(9([0-8][0-9])|(9[0-8]))) 

Целые регулярное выражение:

[A-HJ-NPR-TV-Y]{1}((02[1-9])|(0[3-9][0-9])|([1-8][0-9]{2})|(9([0-8][0-9])|(9[0-8])))[A-HJ-PR-Y]{3} 
+0

Вставить полную строку, иначе она будет неограниченной до другой цифры, появляющейся после окончания – nrathaus

4

Один из вариантов будут соответствие (\d+) и проверить, если это находится в диапазоне 21 - 998 вне регулярного выражения, на языке, который вы используете, если это возможно.


Если это не представляется возможным, вы должны разбить его (только с указанием средней части):

(2[1-9]|[3-9]\d|[1-8]\d\d|9[0-8]\d|99[0-8]) 

Разбивка:

  • 2[1-9] соответствует 21 - 29
  • [3-9]\d соответствует 30 - 99
  • [1-8]\d\d соответствует 100 - 899
  • 9[0-8]\d соответствует 900 - 989
  • 99[0-8] соответствует 990 - 998

Также {1} является излишним и может быть опущена, делая полную REGEX

[A-HJ-NPR-TV-Y](2[1-9]|[3-9]\d|[1-8]\d\d|9[0-8]\d|99[0-8])[A-HJ-PR-Y]{3} 
2

Есть, вероятно, более простые способы сделать это, но одним из способов было бы использовать:

^((?=[^IOQUZ])([A-Z]))((02[^0])|(0[3-9]\d)|([1-8]\d\d)|(9[0-8]\d)|(99[0-8]))((?=[^IQZ])([A-Z])){3}$ 

Для объяснения:

  1. ^ обозначает начало строки.
  2. ((?=[^IOQUZ])([A-Z])) даст вам любой заглавной буквы не < I, O, Q, U, Z>.
  3. ((02[^0])|(0[3-9]\d)|([1-8]\d\d)|(9[0-8]\d)|(99[0-8])) обозначает любое число между (от 21 до 29) или (от 30 до 99) или (от 100 до 899) или (от 900 до 989) или (от 990 до 998)).
  4. ((?=[^IQZ])([A-Z])){3} будет соответствовать любым трем прописным буквам не в < I, Q, Z>.
  5. $ будет обозначать конец строки.
+0

Первая группа вашего регулярного выражения будет соответствовать любому, кроме IOQUZ, нормально. Все, включая символы, цифры и т. Д. Например, «* 021 /» сопоставляется. – Theox

+0

@ Theox: случайно был отправлен в середине. Теперь все должно быть хорошо. –

Смежные вопросы