2013-01-06 3 views
8

В Scala, у меня есть регулярное выражение шаблон вроде этого:шаблон соответствия шаблон регулярных выражений в Haskell

val Regex = """(\d{4})/(\d{2})/(\d{2})""".r 
val Regex(year, month, day) = "2013/01/06" 

Результат является:

year: String = 2013 
month: String = 01 
day: String = 06 

Как я могу добиться подобного результата в Haskell ? Другими словами, могу ли я сопоставить регулярное выражение, содержащее группы, и назначить группы идентификаторам?

+1

См. Главу 8 реального мира Haskell: http://book.realworldhaskell.org/read/efficient-file-processing-regular-expressions-and-file-name-matching.html – Chris

+2

У меня на самом деле книга открыта в этот момент , Примеры устарели, а некоторые не компилируются с GHC 7.4. – Ralph

+0

Похоже, вы используете даты: у haskell нет библиотеки для разбора даты? – fge

ответ

15

Это работает для меня:

Prelude Text.Regex.Posix> "2013/01/06" =~ "([0-9]+)/([0-9]*)/([0-9]*)" :: (String,String,String,[String]) 
("","2013/01/06","",["2013","01","06"]) 

(GHCI 7.4.2 на OS X)

+0

Спасибо. Я попробовал этот тип возврата, и он работает для меня тоже. Я отправлю небольшой вариант вашего ответа, чтобы включить извлечение года, месяца и дня. – Ralph

+0

Это не работает в парсере Posix, но в парсере PCRE: 'let (_, _, _, [год, месяц, день]) =" 2013/01/06 "= ~" (\\ d { 4})/(\\ d {2})/(\\ d {2}) ":: (String, String, String, [String])' – Ralph

+0

Обратите внимание, что Text.Regex.Posix использует регулярные выражения в стиле POSIX. Это также плохо работает в Windows. Если вам нужен этот API, regex-tdfa-compat - лучший выбор –

10

Расширяющаяся на Chris's answer, следующих работ и похожа на мою версию Scala:

ghci> :m +Text.Regex.Posix 
ghci> let (_, _, _, [year, month, day]) ="2013/01/06" =~ "([0-9]+)/([0-9]*)/([0-9]*)" :: (String,String,String,[String]) 
ghci> year 
"2013" 
ghci> month 
"01" 
ghci> day 
"06" 
Смежные вопросы