Regex de texto sublime não detectando tags de várias linhas

129

Eu tenho esse regex aqui;

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

Que deve pegar o texto cercado pela [sometag]tag. Ele funciona para informações de linha única contidas nessas tags, como na string [sometag]this is a bit of text[/sometag]. Mas não funciona em texto que se estende por várias linhas, assim;

[sometag] here is more text

it spans more than one line [/sometag]

Por alguma razão, o localizador de regex do texto sublime não reconhecerá as tags em várias linhas. Quero saber se isso é um problema com o Texto Sublime, uma opção alternável ou apenas minha incompetência pessoal com expressões regulares.

Maurdekye
fonte

Respostas:

239

No início, use um modificador dotall (?s)para fazer o ponto corresponder também aos caracteres de nova linha.

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

DEMO

Avinash Raj
fonte
Obrigado! Por que eu tenho que incluir esses pontos de interrogação extras?
Maurdekye 30/09
8
?after *fará uma partida não gananciosa. Considere [b]foo[/b]foo[b]bar[/b]como exemplo. \[b\].*\[\/b\]corresponderia ao todo desde o início b até o último fechamento b.
Avinash Raj
basta jogar adicionando e removendo o ?neste regex101.com/r/gI0xC3/2
Avinash Raj
11
(? s) faz com que o ponto de também conter várias linhas
cmroanirgo
3
o ponto de interrogação após o asterisco é importante, pois define a correspondência como não gananciosa.
21416 Andrej
12

Se a modificação do modo de ponto for inadmissível por alguns motivos, você pode:

[sometag](.|\n)+?[/sometag]
SynCap
fonte
3
Nunca use (.|\n)+?se você tiver acesso ao modificador DOTALL. Se você não pode usar (?s)em algum falvor, use [\s\S]/ [\d\D]/ [\w\W], mas não o padrão de alternância sugerido aqui. Esse padrão é altamente ineficiente e pode facilmente levar a um problema de tempo limite.
Wiktor Stribiżew
1
@ WiktorStribiżew: Você pode explicar por que é ineficiente? Eu sempre uso [\s\S], mas de relance (.|\n)parece equivalente? Tem a ver com grupos correspondentes? Mas então (?:.|\n)seria o mesmo?
Cerberus