2014-01-30 2 views
1

Формат даты я, ворующих попадают в перестановкам рисунка «слово/DD/YYYY», где слово соответствует месяцев, т.е.Regex для дат в Clojure

(def months ["january" "January" "february" "February" "march" "March" "April" "april" "may" "May" "june" "June" "july" "July" "august" "August" "september" "September" "october" "October" "november" "November" "december" "December"]) 

Итак, возможные перестановки выше картина будет "DD/слово/YYYY" "YYYY/слово/DD" и "YYYY/DD/слово"

Я пытался что-то вдоль линий

(def months-match (clojure.string/join "|" months)) 
(def months-str (str "(\\s*(" months-match ")")) 
(def moster (re-pattern months-str)) 

(defn foomonths [s] 
(map first (re-seq moster s))) 

с планами добавить регулярное выражение для дней и лет

|[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d 

Использование регулярного выражения не было проблемой. Скорее, это процесс формулирования месяцев, которые представляют слова в структуру регулярных выражений с днями и годами в цифрах.

ответ

7

Я вижу, что ваши вопросы касаются регулярных выражений, поэтому я извиняюсь, если этот ответ не соответствует теме, хотя, если я могу предложить несколько иной подход, clj-time включает в себя формат времени, который может обрабатывать большинство из этих случаев из коробка:

project.clj:

(defproject hello "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.5.1"] 
       [clj-time "0.6.0"]] 
    :source-paths ["dev"]) 

user> (def custom-formatter (formatter "dd/MMMMMMMMM/YYYY")) 
#'user/custom-formatter 

user> (parse custom-formatter "14/June/2014") 
#<DateTime 2014-06-14T00:00:00.000Z> 

user> (parse custom-formatter "14/september/2014") 
#<DateTime 2014-09-14T00:00:00.000Z> 

Таким образом, вы могли бы написать один раз, формат строки для каждой перестановки, а затем просто попробовать каждый, пока вы не получите спичку

+0

можно ли преобразовать выходные в векторы ? Я попытался использовать функцию «в», но это было бесполезно. – sunspots

+0

Кроме того, как бы извлечь дату как есть? Не в формате DateTime, скорее, 14 июня/2014, как в вашем примере? – sunspots

+0

1) если вы передадите результат вызова для синтаксического анализа функции bean, вы получите его как карту, тогда вы можете (если хотите) преобразовать это в вектор, вызывая vals, а затем vec. (если вы хотите получить всю информацию) –

Смежные вопросы