2013-02-22 11 views
12

Próbuję przetestować ciąg za podstawowy wzór html i chociaż używam m (multiline) modyfikator działa tylko wtedy, gdy ciąg jest 1-linerClojure multiline wyrażenie regularne

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

katastrofy:

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

Works:

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

Co robię źle?

+1

Zostawię to tutaj http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – mobyte

Odpowiedz

14

Nota prawna: Nie jestem programistą Clojure, ale myślę, że ten problem jest niezależny od języka.

Gdy włączony jest tryb multi-line, interpretacja karetki ^ i dolara $ zmiany takie jak ten: Zamiast dopasowania początek i koniec całego wejściowego łańcucha, odpowiadają one początek i koniec z każda linia w łańcuchu wejściowym. Jest to - o ile widzę - nie to, co chcesz/potrzebujesz.

To, czego potrzebujesz, to dopasowanie do nowych linii (co nie jest domyślnie wykonywane) i można to zrobić, włączając tryb pojedynczej linii. Oznacza to:

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

Możesz to również zweryfikować na RegExr.

10

Należy użyć trybu "dotall" (?s) "switch.

Przykład:

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

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

Przełącznik (?m) jest łudząco nazwie - zmienia co robią ^ i $ kotwice, pozwalając im także dopasować start-of-line i end-of-line, odpowiednio - - czego nie chcesz, czego chcesz.

+0

Dzięki Matt! Inni mogą również znaleźć http://nakkaya.com/2009/10/25/regular-expressions-in-clojure/. –