Регекс піднесеного тексту не виявляє багаторядкових тегів


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 не розпізнає теги в декількох рядках. Я хочу знати, чи це проблема з Sublime Text, перемикаючим варіантом, чи просто моя особиста некомпетентність з регулярними виразами.

Відповіді:


240

На початку використовуйте модифікатор dotall, (?s)щоб крапка відповідала також символам нового рядка.

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

DEMO


Дякую! Чому я повинен включати ці додаткові знаки запитання?
Маврдекіе

8
?після *зробить не жадібний матч. Розглянемо [b]foo[/b]foo[b]bar[/b]як приклад. \[b\].*\[\/b\]відповідатиме цілому від початкового b до останнього завершального b.
Avinash Raj

просто пограйте з додаванням та видаленням ?у цьому regex101.com/r/gI0xC3/2
Avinash Raj

11
(? s) призводить до того, що крапка також включає нові рядки
cmroanirgo

3
знак питання після зірочки важливий, оскільки він визначає матч як ненажерливий.
andrej

12

Якщо зміна режиму крапки з деяких причин є неприйнятною, ви можете взяти таке:

[sometag](.|\n)+?[/sometag]

3
Ніколи не використовуйте, (.|\n)+?якщо у вас є доступ до модифікатора DOTALL. Якщо ви не можете використовувати (?s)в деякій falvor, використання [\s\S]/ [\d\D]/ [\w\W], але не Чергування скоромовка запропонувала тут. Ця закономірність є дуже неефективною і може легко призвести до проблеми з очікуванням.
Wiktor Stribiżew

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