我是regex的新手,但有想法从输入字符串中提取数字和单位。我最初的想法是构建一系列可能的兴趣单元。然后查看输入的数字序列,然后是单位。但是,我不确定如何在正则表达式中结合数组和数字的想法。
我很可能计划使用core.matrix
数组函数构造数组。虽然我不确定这是否是数字和单位的正则表达式耦合的最佳方法。
示例输入可能是"在这里我们正在寻找100公斤袋装大米。"
或者,可能"在这里我们发现了一袋100公斤的大米。"
因此数字和单位之间可能存在空格。
答案 0 :(得分:7)
使用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 quinoa 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"})
答案 1 :(得分:1)
正则表达式[0-9]+ ?[a-zA-Z]+
会找到数字,然后您可以使用正则表达式(?<=[0-9]) ?(?=[a-zA-Z])
拆分结果。