Регулярное выражение 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, переключаемой опцией или просто моей личной некомпетентностью с регулярными выражениями.

Ответы:


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]

3
Никогда не используйте, (.|\n)+?если у вас есть доступ к модификатору DOTALL. Если вы не можете использовать (?s)в каком-либо фальворе, используйте [\s\S]/ [\d\D]/ [\w\W], но не предложенный здесь шаблон чередования. Этот шаблон крайне неэффективен и может легко привести к тайм-ауту.
Wiktor Stribiew

1
@ WiktorStribiżew: Вы можете объяснить, почему это неэффективно? Я всегда использую [\s\S], но на первый взгляд (.|\n)может показаться эквивалентным? Это связано с совпадающими группами? Но тогда (?:.|\n)было бы то же самое?
Cerberus
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.