Проверить содержит ли строка повторяющиеся символы подряд

Нужно реализовать проверку, ввел ли пользователь 2 и более повторяющихся символов подряд. На данном этапе сделал вот так:

$(document).ready(function() {
  $('input[type=password]').keyup(function() {
    var pswd = $(this).val();
    if ( pswd.match(/\w*(\w)(?=\w*\1)\w*/) ) {
       $("#extraRepeatLetter").removeClass('show').addClass('none');
       extraRepeatLetter = 0;
    } else {
       $("#extraRepeatLetter").removeClass('none').addClass('show');
       extraRepeatLetter = 20;
    }
  });
});
#extraRepeatLetter p {
    display: none;
}
#extraRepeatLetter.show p {
    display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form method="POST">
   <ul>
     <li>
        <label for="pswd">Пароль:</label>
        <span>
          <input id="pswd" type="password" name="pswd" class="password"/>
        </span>
     </li>
   </ul>
</form>
<table>
  <tr>
     <td>Пароль не содежрит повторяющихся символов</td>
     <td class="extraRepeatLetter" id="extraRepeatLetter"><p>+20</p></td>
  </tr>
</table>

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

Пример:

  • aqswtyus - не допустимо (у меня работает)

  • aqыwtyuы - не допустимо (не работает)

  • aqSwtyus - не допустимо (не работает)

  • aqЫwtyuы - не допустимо (не работает)

  • aqswtyuы - не допустимо (не работает)

  • aqswtyuЫ - не допустимо (не работает)

Как сделать такую регулярку, что бы они прошла все тесты из примера. Желательно с обьяснениями! Спасибо


Ответы (2 шт):

Автор решения: vsemozhebuty

А вам обязательно регулярка? Если нужно проверить на дубликат любого символа, можно ещё так:

function hasDuplicateSymbols(str) {
  return new Set(str.toLocaleLowerCase()).size !== [...str].length;
}

console.log(hasDuplicateSymbols(''));
console.log(hasDuplicateSymbols('a'));
console.log(hasDuplicateSymbols('aa'));
console.log(hasDuplicateSymbols('aA'));
console.log(hasDuplicateSymbols('Д'));
console.log(hasDuplicateSymbols('Дд'));

Приводим строку к нижнему регистру. Поскольку строка является итератором, её напрямую можно превратить в Set, где все дубликаты символов будут убраны. Потом размер Set-а можно сравнить с размером строки — только нужно пропустить её через spread, чтобы считались символы Юникода, а не элементы суррогатных пар, если они будут.

Если строки короткие (например, пароли), эффективность должна быть приемлемой.

→ Ссылка
Автор решения: dIm0n

Вот так вот (но ваши два последние примера проходят, потому что там нет повторяющихся символов):

/^(?!.*(.).*\1)[a-zа-яё]*$/gim

Тест https://regexr.com/5bhe3

aqswtyus

aqыwtyuы

aqSwtyus

aqЫwtyuы

aqswtyuы

aqswtyuЫ

hey

hello

→ Ссылка