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.

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


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]

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.