从regexp中获取参数

时间:2011-07-01 13:42:47

标签: regex clojure

我希望它以某种方式返回450,$ 1只是一个愚蠢的变量名称。这就像格式的反面。实现这个目标的clojure正则表达式魔法是什么?

(re-something #"$1\sUSD" "450 USD")

3 个答案:

答案 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的返回值中挑选第二个项目的意图更加清晰。