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.

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


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]

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.