2011-07-01 8 views
2

何らかの形で450を返すようにしたいと考えています。$ 1はちょっと変わった名前です。それは形式の逆です。これを達成するためのclojure regexの魔法は何ですか?正規表現の引数を取得する

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

答えて

6
user=> (re-find #"(\d\d\d) (USD)" "450 USD") 
["450 USD" "450" "USD"] 
user=> (nth *1 1) 
"450" 
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から2番目の項目を取り出す予定が明確になりました。

6

私はre-find、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))) 
関連する問題