2014-09-30 20 views
79

Ho questa espressione regolare qui;Sublime Testo regex non rilevato tag multiline

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

Quale dovrebbe catturare il testo circondato dal tag [sometag]. Funziona con informazioni a riga singola contenute in questi tag, come nella stringa [sometag]this is a bit of text[/sometag]. Ma non funziona su testo che si estende su più righe, come questo;

[sometag] here is more text 

it spans more than one line [/sometag] 

Per qualche motivo, il cercatore di espressioni regolari del testo di Sublime non riconoscerà i tag su più righe. Voglio sapere se questo è un problema con Sublime Text, un'opzione alterabile, o semplicemente la mia incompetenza personale con regex.

risposta

142

All'inizio, utilizzare un modificatore dotall (?s) per creare punti in modo che corrispondano ai caratteri di nuova riga.

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

DEMO

+0

Grazie! Perché devo includere questi punti interrogativi aggiuntivi? – Maurdekye

+3

'?' Dopo '*' eseguirà una corrispondenza non avara. Si consideri '[b] foo [/ b] foo [b] bar [/ b]' come esempio. '\ [b \]. * \ [\/b \]' corrisponderebbe al tutto dall'inizio b fino all'ultima chiusura b. –

+0

basta giocare con l'aggiunta e la rimozione del '' 'in questo http://regex101.com/r/gI0xC3/2 –

7

Se la modifica della modalità di punto è inammissibile per alcuni motivi, si può prendere che:

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

Non usare mai '(. | \ N) +?' Se si ha accesso al modificatore DOTALL. Se non puoi usare '(? S)' in qualche falvoro, usa '[\ s \ S]'/'[\ d \ D]'/'[\ w \ W]', ma non il patter di alternanza suggerito qui. Questo schema è altamente inefficiente e può facilmente portare a un problema di timeout. –