Проверить содержит ли строка повторяющиеся символы подряд
Нужно реализовать проверку, ввел ли пользователь 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 шт):
А вам обязательно регулярка? Если нужно проверить на дубликат любого символа, можно ещё так:
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, чтобы считались символы Юникода, а не элементы суррогатных пар, если они будут.
Если строки короткие (например, пароли), эффективность должна быть приемлемой.
Вот так вот (но ваши два последние примера проходят, потому что там нет повторяющихся символов):
/^(?!.*(.).*\1)[a-zа-яё]*$/gim
aqswtyus
aqыwtyuы
aqSwtyus
aqЫwtyuы
aqswtyuы
aqswtyuЫ
hey
hello