Sublime Text regex ne détecte pas les balises multilignes

130

J'ai ce regex ici;

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

Ce qui est censé attraper le texte entouré par la [sometag]balise. Cela fonctionne pour les informations sur une seule ligne contenues dans ces balises, comme sur la chaîne [sometag]this is a bit of text[/sometag]. Mais cela ne fonctionne pas sur du texte qui s'étend sur plusieurs lignes, comme ceci;

[sometag] here is more text

it spans more than one line [/sometag]

Pour une raison quelconque, le chercheur de regex de Sublime text ne reconnaîtra pas les balises sur plusieurs lignes. Je veux savoir si cela pose un problème avec Sublime Text, une option à bascule, ou simplement mon incompétence personnelle avec les expressions régulières.

Maurdekye
la source

Réponses:

240

Au début, utilisez un modificateur dotall (?s)pour que le point corresponde également aux caractères de nouvelle ligne.

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

DEMO

Avinash Raj
la source
Merci! Pourquoi dois-je inclure ces points d'interrogation supplémentaires?
Maurdekye
8
?après *fera un match non gourmand. Considérez [b]foo[/b]foo[b]bar[/b]comme exemple. \[b\].*\[\/b\]correspondrait au tout du début b à la dernière clôture b.
Avinash Raj
il suffit de jouer avec l'ajout et la suppression du ?dans ce regex101.com/r/gI0xC3/2
Avinash Raj
11
(? s) fait que le point inclut également les nouvelles lignes
cmroanirgo
3
le point d'interrogation après l'astérisque est important car il définit la correspondance comme non gourmande.
andrej
12

Si la modification du mode de point est inadmissible pour certaines raisons, vous pouvez prendre cela:

[sometag](.|\n)+?[/sometag]
SynCap
la source
3
Ne jamais utiliser (.|\n)+?si vous avez accès au modificateur DOTALL. Si vous ne pouvez pas utiliser (?s)dans certains falvor, utilisez [\s\S]/ [\d\D]/ [\w\W], mais pas le motif d'alternance suggéré ici. Ce modèle est très inefficace et peut facilement conduire à un problème de délai d'attente.
Wiktor Stribiżew
1
@ WiktorStribiżew: Pouvez-vous expliquer pourquoi il est inefficace? Je l'utilise toujours [\s\S], mais en un coup d'oeil cela (.|\n)me paraîtrait équivalent? Est-ce à voir avec les groupes correspondants? Mais alors (?:.|\n)serait la même chose?
Cerberus