Получение аргументов из регулярного выражения - PullRequest
2 голосов
/ 01 июля 2011

Я хочу, чтобы он каким-то образом возвращал 450, $ 1 - просто глупое имя переменной. Это как обратный формат. Какая магия для регулярных выражений clojure для достижения этой цели?

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

Ответы [ 3 ]

6 голосов
/ 01 июля 2011

Мне нравится использовать re-find, if-let и destruuring.Я очень часто пишу код разбора по следующей схеме:

(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)))
6 голосов
/ 01 июля 2011
user=> (re-find #"(\d\d\d) (USD)" "450 USD")
["450 USD" "450" "USD"]
user=> (nth *1 1)
"450"
4 голосов
/ 01 июля 2011

Я часто использую эту структуру, чтобы соответствовать моей первой группе в регулярном выражении:

(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 более ясна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...