Я пытаюсь выяснить, почему регулярное выражение с отрицательным взглядом в будущее не срабатывает, когда включена опция «одна строка».
Пример (упрощенный):
<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)
ТАКЖЕ НЕ УДАЕТСЯ, если включен однострочный режим, поэтому, похоже, это не проблема жадности.Попробуйте это в конструкторе Regex (например, в Expresso или Rad regex):
При отключении одной строки оно соответствует (как и ожидалось):
<source>Test 1</source>
<source>Test 3</source>
При включении одной строки:
<source>Test 3</source>
Я не понимаю, почему он также не соответствует первому: он не содержит первого негативного взгляда вперед, поэтому он должен соответствовать выражению.