Вы получаете совершенно правильные результаты.
Давайте возьмем ваше первое регулярное выражение .*(.).*\1
и некоторые примеры.
Например, строка abcabcbb
и здесь вы получите b
.Давайте посмотрим, почему.
Ваше регулярное выражение - .*(.).*\1
, которое начинается с .*
, что является жадным, и это означает, что он будет потреблять как можно больше символов, обеспечивая совпадение.Так что .*
захватывает abcabc
, поскольку это максимально возможный захват, который может сделать .*
, а (.)
будет соответствовать b
, а .*
будет соответствовать пустой строке, и снова \1
будет соответствовать b
, и этоконец матчаСледовательно, (.)
захватили b
, когда вы его получаете.Так что это не неправильное совпадение.
Теперь давайте возьмем пример не жадной версии регулярного выражения: .*?(.).*?\1
Пусть строка примера будет abba
.Это даст вам a
и давайте посмотрим, почему.
Ваше регулярное выражение .*?(.).*?\1
начинает совпадать с .*?
и, следовательно, на этот раз пытается совпадать как можно меньше, следовательно, ничего не совпадает, тогда (.)
соответствует a
а потом .*?соответствует bb
(помните, что оно должно соответствовать минимуму, но все равно генерировать совпадение) и, наконец, \1
соответствует финалу a
.Вот так заканчивается матч, и вы получаете a
в (.)
, и это правильно.