2011-12-14 26 views
5

Mam problem z wyrażeń regularnych w haskell. Konkretnie:Składnia wyrażeń regularnych Haskella

Prelude Text.Regex.Posix> "1" =~ "\d" :: Bool 
<interactive>:1:10: 
    lexical error in string/character literal at character 'd' 
Prelude Text.Regex.Posix> "1" =~ "\\d" :: Bool 
False 
Prelude Text.Regex.Posix> "1" =~ "\\\\d" :: Bool 
False 

Czy Haskell nie ma innych takich wygodnych kodów \d lub \s lub uciec? Tak, wiem, że mogę zamiast tego zrobić [0-9], ale kody ucieczki mogą być znacznie bardziej wygodne dla złożonych wyrażeń regularnych. Czy tu brakuje czegoś oczywistego?

+0

Byłoby miło zobaczyć przykładowe rozwiązanie, które akurat pasuje do '\\ d' lub jakiegoś wariantu, ponieważ wciąż walczę. –

Odpowiedz

8

Nie wiem zbyt wiele o pakietach regex Haskella, ale z powyższych przykładów z "Text.Regex.Posix" mogę wywnioskować, że masz do czynienia z wyrażeń regularnych POSIX. Sekwencje specjalne, takie jak \ d i \ s, nie są częścią składni regex POSIX i wydaje mi się, że pochodzą z Perla i od tego czasu są propagowane w innych językach.

+0

Fajnie, nie miałem pojęcia, że ​​tak było. – So8res

+0

Moduł "Text.Regex.Posix" wykorzystuje przypuszczenia funkcji obcej do API regex C POSIX, jak sądzę. Jesteś więc prawdopodobnie poprawny. –

14

Nie, Haskell nie posiada sekwencje jak \d i \s. To znaczy. język Haskell ich nie ma. Ponieważ język Haskell również nie ma obsługi wyrażeń regularnych. Istnieje tylko kilka bibliotek, które zapewniają regularne wyrażenia.

W związku z tym należy sprawdzić, czy biblioteka regex, której używasz, obsługuje \d i \s. A kiedy go obsługują, musisz zapisać je jako "\\d" w pliku źródłowym Haskella.

Gdy \d pochodzi od Perla, możesz odnieść większy sukces z regex-pcre.

+0

+1 za wskazanie, że wyrażenie regularne to elementy biblioteki i wskazanie w '\\ d' – scravy

Powiązane problemy