parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

string.match — опция m и dot_all

G_Z 10.05.2016 22:18

Задача: найти блоки, начинающиеся с заданного символа.
Есть опция «m», которая влияет на поиск начала и конца строки (при влияние на начало строки в документации, кстати, ни слова).

Пробуем:
@main[]
$text[^@method1[]
body

^@method2[]
body
]
<pre>^json:string[^text.match[^^@(.+);gm];$.indent(true)]</pre>
Получаем:
[
	{"prematch":"","match":"","postmatch":"","1":"method1[]"},
	{"prematch":"","match":"","postmatch":"","1":"method2[]"}
]
Точка перестала совпадать с символом новой строки.

Убираем опцию «m»: корректно находим тело метода, но, понятно, лишаемся привязки к началу любой строки:
@main[]
$text[

^@method1[]
body

^@method2[]
body
]
<pre>^json:string[^text.match[^^@(.+);g];$.indent(true)]</pre>
[
	{"prematch":"","match":"","postmatch":"","1":"method1[]\nbody\n\n@method2[]\nbody\n"}
]
Опция «m» отключает dot_all-режим?

P. S. В документации до сих пор написано
Этот метасимвол, совпадает с любым символом кроме символа новой строки по умолчанию.
, что не соответствует истине — по умолчанию точка совпадает в том числе с символом новой строки.