Числа и единицы регулярного выражения

Я новичок в регулярном выражении, но имею в виду, что вы извлекаете числа и единицы из входной строки. Моя первоначальная идея состоит в том, чтобы построить массив возможных единиц, представляющих интерес. Затем просмотрите ввод для последовательности цифр, за которыми следуют единицы. Однако я не уверен, как связать идею массива и цифр внутри регулярного выражения.

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

В качестве примера можно привести "здесь мы ищем 100 кг мешков с рисом".

Или, возможно, "здесь мы нашли мешок из 100 кг риса".

Таким образом, между цифрами и единицами может существовать пробел.

2 ответа

Используя re-seq и правильное регулярное выражение, вы должны начать:

(defn find-things [s] (map (fn [[_ count unit]] {:count count, :unit unit}) (re-seq #"(\d+)\s*(kg|lb)" s)))
(find-things "here we are looking for 100kg bags of rice.")
; => ({:count "100", :unit "kg"})
(find-things "here we found a 100 lb bag of rice.")
; => ({:count "100", :unit "lb"})
(find-things "mix 99lb ****** with 45kg barley.")
; => ({:count "99", :unit "lb"}
; {:count "45", :unit "kg"})

редактировать

Перечитывая свой вопрос, я вижу, что вы хотите иметь динамический набор единиц. Вот пример для этого:

(def units ["lb" "kg" "L" "ml"])
(def unit-match (clojure.string/join "|" units))
(def matching-str (str "(\\d+)\\s*(" unit-match ")")) ;; note escaped backslashes
(def matching-pattern (re-pattern matching-str))
; replace the literal regexp in the function above with 'matching-pattern'
(find-things "add 100ml to 900ml to yield 1 L!")
; => ({:count "100", :unit "ml"}
; {:count "900", :unit "ml"}
; {:count "1", :unit "L"})


[0-9]+?[a-zA-Z]+ выражение [0-9]+?[a-zA-Z]+ найдет числа, а затем вы можете разделить результат с регулярным выражением (?<=[0-9])?(?=[a-zA-Z]).

licensed under cc by-sa 3.0 with attribution.