Регулярное выражение Sublime Text не обнаруживает многострочные теги

130

У меня есть это регулярное выражение;

\[sometag\](.*)\[/sometag\]

Который должен улавливать текст, окруженный [sometag]тегом. Это работает для однострочной информации, содержащейся в этих тегах, как и для строки [sometag]this is a bit of text[/sometag]. Но это не работает с текстом, который занимает несколько строк, как этот;

[sometag] here is more text

it spans more than one line [/sometag]

По какой-то причине средство поиска регулярных выражений Sublime text не распознает теги в нескольких строках. Я хочу знать, проблема ли это с Sublime Text, переключаемой опцией или просто моей личной некомпетентностью с регулярными выражениями.

Maurdekye
источник

Ответы:

240

Вначале используйте модификатор dotall, (?s)чтобы точка соответствовала также символам новой строки.

(?s)\[sometag\](.*?)\[\/sometag\]

DEMO

Авинаш Радж
источник
Спасибо! Почему я должен включать эти лишние вопросительные знаки?
Maurdekye
8
?after *будет делать нежадный матч. Рассмотрим [b]foo[/b]foo[b]bar[/b]как пример. \[b\].*\[\/b\]будет соответствовать целому от начала b до последнего закрытия b.
Авинаш Радж
просто поиграйте с добавлением и удалением ?в этом regex101.com/r/gI0xC3/2
Авинаш Радж
11
(? s) заставляет точку также включать
новые
3
вопросительный знак после звездочки важен, поскольку он определяет совпадение как нежадное.
andrej
12

Если изменение режима точки по каким-либо причинам недопустимо, вы можете принять это:

[sometag](.|\n)+?[/sometag]
SynCap
источник
3
Никогда не используйте, (.|\n)+?если у вас есть доступ к модификатору DOTALL. Если вы не можете использовать (?s)в каком-либо фальворе, используйте [\s\S]/ [\d\D]/ [\w\W], но не предложенный здесь шаблон чередования. Этот шаблон крайне неэффективен и может легко привести к тайм-ауту.
Wiktor Stribiew
1
@ WiktorStribiżew: Вы можете объяснить, почему это неэффективно? Я всегда использую [\s\S], но на первый взгляд (.|\n)может показаться эквивалентным? Это связано с совпадающими группами? Но тогда (?:.|\n)было бы то же самое?
Cerberus