Это регулярное выражение не имеет большого значения и может быть сокращено до:
.{4,}$ // match at least 4 characters (or more) before ending
Причина в том, что lookaheads определяют, где заканчивается соответствующий шаблон группы , заканчивается .Но вы помещаете lookahead в начало входной строки, ловя "" (ничто) перед всеми шаблонами lookahead.Таким образом, все lookaheads являются избыточными.
Итак:
^
шаблон должен начинаться с начала ввода
(?=.*[a-zA-Z])
найти заголовок любого количества последовательных алфавитов (найден «TestPassword», не для включения в соответствующую группу)
(?=.*[0-9])
найти заголовок любого количества цифр (найдено «1», не для включения в группу соответствия)
Учитывая выше, единственное совпадение - это "" в начале "TestPassword1".Теперь мы продолжаем сопоставление ...
.{4,}$
теперь сопоставляем что-либо, по крайней мере, с 4 символами, расположенными прямо в конце ввода (найдено "TestPassword1", который равен , возвращен как совпадающая группа)
См. Приведенный ниже код для подтверждения и объяснения:
let regex = /^(?=.*[a-zA-Z])(?=.*[0-9]).{4,}$/;
[match] = "TestPassword1".match(regex);
console.log(match); //TestPassword1
// just test for lookaheads result in matching an empty string at the start of input (before "T")
regex = /^(?=.*[a-zA-Z])(?=.*[0-9])/;
match = "TestPassword1".match(regex);
console.log(match); //[""]
// we're now testing for at least 4 characters of anything just before the end of input
regex = /.{4,}$/;
[match] = "TestPassword1".match(regex);
console.log(match); //TestPassword1