Regex для проверки не более 2 чисел и не более 4 алфавитов в строке длиной 6 - PullRequest
2 голосов
/ 24 августа 2009
  1. Максимальная длина строки равна 6.
  2. Строка должна содержать не более 2 цифр
  3. Строка должна содержать не более 4 алфавитов

Таким образом, следующие примеры должны соответствовать

abcd22

a1cd3d

11acde

a1c

1ad

Ответы [ 5 ]

2 голосов
/ 24 августа 2009

Я бы сделал ИЛИ тест группы регулярных выражений:

/^[a-z0-9]{0,6}$/ # at most 6 characters
/([a-z].*){5}/    # more than 4 letters
/(\d.*){3}/       # more than 2 digits

Итак:

if ( /^[a-z0-9]{0,6}$/ and !( /([a-z].*){5}/ or /(\d.*){3}/ ) ) {
  print "valid";
}
1 голос
/ 24 августа 2009

Я бы не использовал регулярное выражение для этого, за исключением, может быть, для проверки буквенно-цифровых / менее 6: /^[0-9a-z]{1,6}$/i. Но условия подсчета, хотя технически выполнимые с использованием регулярных выражений, выполняются лучше с простым подсчетом.

Так что я бы

  1. Проверить, соответствует ли оно регулярному выражению /^[0-9a-z]{1,6}$/i
  2. Затем используйте цикл for, чтобы подсчитать количество случаев возникновения ошибки
1 голос
/ 24 августа 2009

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

/x{2,3}/ # 2 or 3 ‘x’s

… но на самом деле это не считается, потому что это просто сокращение для этого выражения:

/xxx?/

т.е. 2 x, затем третий (необязательный).

Ваше выражение, с другой стороны, должно будет отслеживать два разных счетчика по всему автомату, который представляет выражение. Это просто невозможно в классических регулярных выражениях (и все же очень сложно использовать более современные воплощения регулярных выражений, которые используют автоматы pushdown для сохранения состояний).

0 голосов
/ 24 августа 2009

Вы можете сделать это, используя негативные взгляды.

(?!\d{5})(?![a-z]{3})[a-z0-9]{1,6}

(?!\d{5}) не удается, если найдено 5 или более цифр

(?![a-z]{3}) не удается, если найдено 3 или более символов

Если оба из них пройдут, мы наконец проверяем, что есть от 1 до 6 буквенно-цифровых символов с (?!\d{5})(?![a-z]{3})[a-z0-9]{1,6}

0 голосов
/ 24 августа 2009

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

bool IsValid(string s)
{
   int numInts = 0;
   int numChars = 0;
   Regex isDigit = new Regex(@"\d");
   Regex isChar  = new Regex(@"[a-zA-Z]"); // NOTE: will NOT catch non english letters

   if (s.Length() <= 6) 
   {
       return false;
   }

   foreach (char c in s)
   {
       if (isDigit.IsMatch(c)) 
       {
           ++numInts;
       }
       if (isChar.IsMatch(c))
       {
           ++numChars;
       }
   }

   return numInts == 2 && numChars == 4;

}

Создайте / переименуйте аргументы в соответствии с вашими потребностями.

Конечно, если вы хотите быть очень похожим на C, вы можете провести числовое сравнение на символе, но это еще больше уведет вас от твердого и надежного решения.

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