Регулярное выражение - PullRequest
0 голосов
/ 16 июня 2020

Может ли кто-нибудь помочь мне с регулярным выражением, которое

  1. не должно содержать 9 цифр (123456789 или 123-45-6789).
  2. Следует принимать подчеркивание (_), дефис (-), точка (.) или символ (@).

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

  1. ^ (((?! ([0-9] {3,3} - [0-9] {2,2} - [0-9] { 4,4}) | [0-9] {9}).) * $
  2. ^ [_-. @] + $

Примеры:

Допустимые строки:

  1. testUser
  2. testUser038
  3. testUser038 @, testUser@., testUser-, et c (любая комбинация @ -_.)
  4. 038testUser

Недействительные строки:

  1. testUser123456789
  2. 123456789
  3. 123-45-6789
  4. testUser123-45-6789
  5. testUser ^ (Другие специальные символы, кроме (@ -_.))

Ответы [ 3 ]

1 голос
/ 16 июня 2020
var re =new Regex("^([[a-zA-Z_@.-]*[0-9]){0,8}[[a-zA-Z_@.-]*$");

var strings = new[] { "testUser",
"testUser038",
"testUser038@", "testUser@.", "testUser-",
"038testUser",
"testUser123456789",
"123456789",
"123-45-6789",
"testUser123-45-6789",
"testUser^"
};

foreach (var x in strings
    .Select(s => new
    {
        Value = s,
        IsMatch = re.IsMatch(s),
    }))
{
    Console.WriteLine($"{x.IsMatch}: {x.Value}");
}

выводит:

True: testUser
True: testUser038
True: testUser038@
True: testUser@.
True: testUser-
True: 038testUser
False: testUser123456789
False: 123456789
False: 123-45-6789
False: testUser123-45-6789
False: testUser^

Объяснение:

Регулярное выражение выполняет поиск от нуля до 8 цифр, которым может предшествовать любое количество букв (нижний или верхний регистр) или заданное c символов. За шаблоном может следовать (снова) любое количество букв и / или этих символов.
Это «любое число» также может быть нулем.

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

Используйте следующее регулярное выражение:

^(?=(?:[-_.@a-z]*\d){0,8}[-_.@a-z]*$)[-_.@a-z\d]+$

с параметрами g , m и i

Подробности:

  • ^ - начало строки (опция m ).
  • (?= - начало положительного просмотра вперед (проверьте текущую строку на макс. 8 цифр, с другими разрешенными символами до / между / после них).
    • (?: - начало группы без захвата.
      • [-_.@a-z]* - Возможная пустая последовательность разрешенных символов (также заглавных букв), кроме цифр.
      • \d - A di git.
    • ){0,8} - Конец группы без захвата, эта группа может встречаться до 8 раз.
    • [-_.@a-z]* - Другая (возможно, пустая) последовательность разрешенных символов, кроме цифр (после последней разрешено di git).
    • $ - Конец строки - в текущей строке запрещен другой контент.
  • ) - Конец положительного просмотра вперед .
  • [-_.@a-z\d]+ - Соответствующее содержимое - непустая последовательность разрешенных символов.
  • $ - Конец строки.

Чтобы поставить это коротко:

  • Положительный просмотр вперед проверяет макс. 8 цифр в текущей строке.
  • Тогда [...] соответствует разрешенному содержимому до конца строки.

Обратите внимание на такое важное отличие вашего регулярного выражения: После [ (открытие класса символов) первый символ - это -, поэтому таким образом он обрабатывается буквально . Вы помещаете - в середину , поэтому оно действует как условие «от - до» (неверно).

Рабочий пример см .: https://regex101.com/r/yniJl4/1

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

Вы можете проверить строку с помощью следующего регулярного выражения.

(?i)^(?![^\d\n]*(?:\d[^\d\n]*){9}$)[a-z\d_.@-]*$

Запустите свой механизм!

Механизм регулярных выражений выполняет следующие операции.

(?i)          : invoke case-indifferent mode
^             : match beginning of string       
(?!           : begin a negative lookahead
  [^\d\n]*    : match 0+ chars other than digits and newlines
  (?:         : begin non-capture group
    \d        : match a digit
    [^\d\n]*  : match 0+ chars other than digits and newlines
  )           : end non-capture group
  {9}         : execute non-capture group 9 times
  $           : match end of string
)             : end negative lookahead
[a-z\d_.@-]*  : match 0+ chars in character class
$             : match end of string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...