我希望它以某种方式返回450,$ 1只是一个愚蠢的变量名称。这就像格式的反面。实现这个目标的clojure正则表达式魔法是什么?
(re-something #"$1\sUSD" "450 USD")
答案 0 :(得分:6)
user=> (re-find #"(\d\d\d) (USD)" "450 USD")
["450 USD" "450" "USD"]
user=> (nth *1 1)
"450"
答案 1 :(得分:6)
我喜欢使用重新查找,if-let和destructuring。我经常用以下模式编写解析代码:
(def currency-regex #"(\d+) ([A-Z]{3})")
(defn parse-currency [s]
(if-let [[_ amount currency] (re-find currency-regex s)]
(process amount currency)
(signal-error s)))
答案 2 :(得分:4)
我发现自己在正则表达式中使用这个结构来匹配我的第一个组:
(second (re-find #"foo(bar)" "This is a foobar example"))
;=> "bar"
...因为通常情况下,我只是捕捉一个项目,就像你使用数字一样。为了更好地阅读您的代码,您可以为这种情况设置second
函数的别名,因此您的意图很明确:
(def first-match second)
(first-match (re-find #"foo(bar)" "This is a foobar example"))
;=> "bar"
也许first-match
可以first-group
更准确,但你明白了。现在,从re-find
的返回值中挑选第二个项目的意图更加清晰。