Я пытаюсь понять, почему регулярное выражение с отрицательным просмотром вперед не работает, когда включена опция «одна строка».
Пример (упрощенный):
<source>Test 1</source>
<source>Test 2</source>
<target>Result 2</target>
<source>Test 3</source>
Этот:
<source>(?!.*<source>)(.*?)</source>(?!\s*<target)
завершится ошибкой, если включена однострочная опция, и будет работать, если однострочная опция отключена. Например, это работает (отключает опцию одной строки):
(?-s:<source>(?!.*<source>)(.*?)</source>(?!\s*<target))
Насколько я понимаю, однострочный режим просто позволяет использовать точку "." чтобы соответствовать новым строкам, и я не понимаю, почему это повлияет на выражение выше.
Может ли кто-нибудь объяснить, что мне здесь не хватает?
::::::::::::::::::::::
РЕДАКТИРОВАТЬ: (?!.*) - это негативный прогноз, а не группа захвата.
<source>(?!.*?<source>)(.*?)</source>(?!\s*<target)
ТАКЖЕ будет FAIL, если включен однострочный режим, поэтому не похоже, что это проблема жадности. Попробуйте это в конструкторе регулярных выражений (например, регулярное выражение Expresso или Rad):
С отключенной одной строкой это соответствует (как и ожидалось):
<source>Test 1</source>
<source>Test 3</source>
При включенной одной линии:
<source>Test 3</source>
Я не понимаю, почему он не соответствует первому: он не содержит первого отрицательного взгляда вперед, поэтому он должен соответствовать выражению.