Я думаю, у вас есть идея заглянуть немного запутанно. Когда вы говорите, в шаблоне 2,
(?=[a-k])o
это означает, что «когда мы находимся в месте, где следующий символ имеет значение от a
до k
, соответствует o
». Неудивительно, что это никогда не совпадает - если мы находимся в месте, где следующий символ равен что-то от a
до k
, это не и будет o
!
Схема 3 еще ярче
(?=k)o
означает «когда мы находимся в месте, где следующий символ - k
, соответствует o
». Опять нет совпадений.
Причина, по которой pattern1 соответствует , заключается в том, что o
находится в a-z
, поэтому всякий раз, когда следующий символ равен o
, он также соответствует критерию "что-то в a
to z
', и так совпадает.
Я также не уверен, почему вы ожидали, что #
не заменит o
в 2 и 3. Если 5 делает то, что вы хотите, то, конечно, вы можете просто использовать его? Я не могу с готовностью увидеть, как использовать упреждающий просмотр, чтобы сделать то, что делает 5 - чтобы выполнить операцию 'сопоставить (просто) o
, что предшествует чем-то от a
до k
', посмотрите- позади кажется очевидным ответом:
(?<=[a-k])o
должно соответствовать именно такому o
(но я сам не запускал его).