Регулярное выражение для не более двух повторяющихся букв/цифр - программирование
Подтвердить что ты не робот

Регулярное выражение для не более двух повторяющихся букв/цифр

У меня есть требование, которое должно обрабатывать выражение регулярного выражения не более 2 одинаковых букв/цифр в файле xsl

-no space
-does not support special chars.
-support (a-z,A-Z,0-9), 
-require one of a-z,
-require one of 0-9,
-no more than 2 same letter/digits (i.e BBB will fail, BB is accepted)

что я до сих пор

(?:[^a-zA-Z0-9]{1,2})
4b9b3361

Ответ 1

Это регулярное выражение будет делать это: ^(?!.*([A-Za-z0-9])\1{2})(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+$

Здесь пробой:

(?!.*([A-Za-z0-9])\1{2}) гарантирует, что ни один из символов не повторяется более двух раз подряд.

(?=.*[a-z]) требуется хотя бы одна строчная буква

(?=.*\d) требуется хотя бы одна цифра

[A-Za-z0-9]+ позволяет использовать только буквы и цифры

РЕДАКТИРОВАТЬ: удалил посторонний .* из отрицательного вида

Ответ 2

Для сопоставления того же символа, который повторяется 3 или более раз подряд, попробуйте:

([a-zA-Z0-9])\1{2,}

Примеры совпадений (проверены как здесь и здесь): AABBAA (нет совпадений), AABBBAAA (соответствует BBB и AAA), ABABABABABABABA (нет совпадений), ABCCCCCCCCCC (соответствует CCCCCCCCCC).

Ответ 3

Работает ли это для вас?

/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/

Попробуйте:

var regex = new RegExp(/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/)
var tests = ['A1D3E', 'AAAA', 'AABAA', 'abccddeeff', 'abbbc', '1234']

for(test in tests) {
   console.log(tests[test] + ' - ' + Boolean(tests[test].match(regex)))
}

Будет выводиться:

A1D3E - true
AAAA - false
AABAA - true
abccddeeff - true
abbbc - false
1234 - true

Ответ 4

Вы можете сделать это в двух регулярных выражениях:

  • /^(?=.*[a-z])(?=.*[0-9])[a-z0-9]+$/i Это гарантирует, что есть хотя бы 1 цифра и 1 буква, одновременно принимая только буквы и цифры (без пробелов или специальных символов)
  • /([a-z0-9])\1{2,}/i Если это соответствует, то повторяется символ. Это означает, что вы должны бросить false.

Пояснение:

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

  • ^: совпадение начала строки
  • (?=.*[a-z]): проверьте, есть ли хотя бы одна буква
  • (?=.*[0-9]): проверьте, есть ли хотя бы одна цифра
  • [a-z0-9]+: если проверки были истинными, то одно или несколько раз совпадают только цифры/буквы
  • $: совпадение конца строки
  • i: модификатор, не учитывающий регистр регистр.

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

  • ([a-z0-9]): сопоставление и группировка цифры или буквы
  • \1{2,}: сопоставить группу 1 два или более раза
  • i: модификатор, не учитывающий регистр регистр.

Ответ 5

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

Например, я лично проведу проверку каждого из ваших условий в отдельном тесте. Сначала проверьте пробелы. Во-вторых, проверьте хотя бы одну букву. Затем проверьте хотя бы одно число. Наконец, найдите любые интервалы из трех или более повторяющихся символов.

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

Например:

function do_validation(string) {
    return (has_no_space(string) &&
            has_no_special_char(string) &&
            has_alpha(string) &&
            has_digit(string) &&
            ! (has_repeating(string)))

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