Регулярное выражение, чтобы проверить максимум 2 цифры, максимум 4 алфавита в буквенно-цифровой строке длиной 6? - PullRequest
0 голосов
/ 23 августа 2009

Должен соответствовать всем следующим примерам.

aBCd22
a2b2CD
22aBcD

Ответы [ 6 ]

7 голосов
/ 23 августа 2009

Компактная версия с использованием оператора позитивный взгляд :

^(?=(.*[0-9]){2})(?=(.*[A-Za-z]){4})[A-Za-z0-9]{6}$

Пояснение:

(?=(.*[0-9]){2}) # asserts that you have 2 digits
(?=(.*[A-Za-z]){4}) # asserts that you have 4 characters
[A-Za-z0-9]{6} # does the actual matching of exactly 6 alphanumeric characters

Простой тестовый пример на Python:

import re
rex = re.compile('(?=(.*[0-9]){2})(?=(.*[A-Za-z]){4})[A-Za-z0-9]{6}')
tests = ['aBCd22', 'a2b2CD', '22aBcD', 'asd2as', '', '201ABC', 'abcA213']
for test in tests:
print "'%s' %s" % 
       (test, "matched" if rex.match(test) != None else "didn't match")

Выход:

'aBCd22' matched
'a2b2CD' matched
'22aBcD' matched
'asdas' didn't match
'' didn't match
'201ABC' didn't match
'abcA213' didn't match
1 голос
/ 23 августа 2009

Я не думаю, что регулярные выражения - это путь сюда.

Конечно, вы можете создать чередование всех возможных разрешенных порядков цифр и букв, но вам понадобится 6 * 5 = 30 из них.

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

Вы можете иметь регулярное выражение для проверки наличия 6 буквенно-цифровых символов, а затем выполнить подсчет вручную.

1 голос
/ 23 августа 2009

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

В Perl я бы сделал:

m/\d.*\d/ # match exactly 2 numeric characters
  &&
m/(?:[[:alpha:]].*){4}/ # match exactly 4 alpha characters
0 голосов
/ 23 августа 2009
^((?<digit>\d)|(?<alpha>[a-zA-Z])){6}
(?<-alpha>){4}(?(alpha)(?!))
(?<-digit>){2}(?(digit)(?!))$

Это будет соответствовать 6 символов с ровно 2 цифрами и 4 буквами. Он делает это, захватывая все, что может, затем подсчитывает результаты, выталкивая их из стека счетчиков. Проверьте эту ссылку для более подробной информации.

  • (? <- alpha>) {4} означает «pop 4 соответствует стеку». Если это не может появиться, это терпит неудачу
  • (? (Альфа) (?!)) означает «если есть альфа-совпадение, ищите (?!), Что всегда не получается.
  • ^ и $ соответствуют началу и концу
0 голосов
/ 23 августа 2009

Это регулярное выражение должно делать это:

^(?=[a-zA-Z]*\d[a-zA-Z]*\d[a-zA-Z]*$)(?=\d*[a-zA-Z]\d*[a-zA-Z]\d*[a-zA-Z]\d*[a-zA-Z]\d*$).*

или более компактный:

^(?=[a-zA-Z]*(?:\d[a-zA-Z]*){2}$)(?=\d*(?:[a-zA-Z]\d*){4}$).*
0 голосов
/ 23 августа 2009

Может быть, это?

(?=[a-z]*\d?[a-z]*\d?)
(?![a-z]*\d[a-z]*\d[a-z]*\d)
(?=\d*[a-z]?\d*[a-z]?\d*[a-z]?\d*[a-z]?)
(?!\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z])
[\da-z]{2,6}

Работает, убедившись, что выделение имеет ноль, одну или две цифры (первый взгляд), но не более двух (второй взгляд). Точно так же это проверяет от нуля до четырех букв (третий взгляд), но не больше, чем четыре (четвертый взгляд). Пятая строка соответствует одному-шести символам.

Если вы хотите сопоставлять только слова, оберните его в \b.

РЕДАКТИРОВАТЬ: Теперь вы добавили требование, чтобы длина совпадения составляла шесть символов. Требуется лишь небольшая модификация:

(?=[a-z]*\d[a-z]*\d)
(?![a-z]*\d[a-z]*\d[a-z]*\d)
(?=\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z])
(?!\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z])
[\da-z]{6}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...