2013-02-22 20 views
12

sto cercando di testare una stringa per uno schema di base html e anche se uso il modificatore (multilinea) m funziona solo quando la stringa è un 1-linerClojure multilinea espressione regolare

(re-find #"(?im)^<html>.*<body>.*</body>.*</html>" c)) 

fallisce:

"<html> <body> sad </body> 
    </html>" 

Works:

"<html> <body> sad </body>  </html>" 

che cosa sto facendo di sbagliato?

+1

Lo lascerò qui http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – mobyte

risposta

14

Disclaimer: Non sono un programmatore Clojure, ma penso che questo problema sia indipendente dalla lingua.

Quando la modalità multi-linea è abilitata, l'interpretazione del punto di inserimento ^ e il dollaro $ cambiamenti come questo: Invece di corrispondenza dell'inizio e della fine di tutta la stringa di input, hanno l'inizio e la fine di ogni riga nella stringa di input. Questo è - per quanto posso vedere - non quello che vuoi/bisogno.

Quello che vuoi è per il tuo .* s per corrispondere a newline (cosa che non fanno per impostazione predefinita) e questo può essere fatto abilitando la modalità a linea singola. Quindi questo significa:

(re-find #"(?is)^<html>.*<body>.*</body>.*</html>" c)) 

Si può anche verificare questo su RegExr.

10

È necessario utilizzare (?s) "modalità dotall" switch.

Esempio:

user=> (re-find #"\d{3}.\d{3}" "123\n456")  
nil 

user=> (re-find #"(?s)\d{3}.\d{3}" "123\n456") 
"123\n456" 

L'interruttore (?m) è ingannevolmente chiamato - cambia quello che i ^ e $ ancore fanno, che consentano di confrontare anche, rispettivamente, start-of-line e end-of-line, - - che non vuoi che tu voglia

+0

Grazie Matt! Altri potrebbero trovare utile anche http://nakkaya.com/2009/10/25/regular-expressions-in-clojure/. –