Дело в том, что весь шаблон группы .*?(?=t)
может соответствовать пустой строке.Он останавливается перед первым t
и не может «перепрыгнуть», потому что остается там, где он есть, когда совпадает шаблон прогнозирования (непотребляющий шаблон).
Вы не можете делать это так, вы должны потреблять (и перемещать индекс регулярных выражений) хотя бы один символ.
Альтернативное решение для этого конкретного случая -
^(?:[^t]*t){2}[^t]*
См. regex demo , ^(?:[^t]*t){2}[^t]*
соответствует началу строки (^
), затем использует два вхождения ({2}
) любых символов, кроме t
([^t]*
), затемс t
, а затем снова использует два вхождения ({2}
) любых символов, отличных от t
.
Или, общее решение для случая (если t
является строкой из нескольких символов):
^(?:.*?t){2}(?:(?!t).)*
См. еще одну демонстрацию регулярных выражений .Шаблон (?:.*?t){2}
соответствует двум вхождениям любых 0+ символов, как можно меньше, вплоть до первого t
, а затем (?:(?!t).)*
соответствует любому типу символов 0+, который не запускает последовательность символов t
,