Компактные Clojure кодируют для соответствий регулярного выражения и их положения в строке

Stuart Halloway дает пример

(re-seq #"\w+" "The quick brown fox")

поскольку естественный метод для нахождения соответствий regex соответствует в Clojure. В его книге эта конструкция контрастируется с повторением по matcher. Если бы все, одним заботившимся о был список соответствий, это было бы большим. Однако, что, если я хотел соответствия и их положение в строке? Существует ли лучший способ сделать это, которое позволяет мне усиливать существующую функциональность в java.util.regex с обращением к чему-то как понимание последовательности по каждому индексу в исходной строке? Другими словами, можно было бы хотеть ввести что-то как

(re-seq-map # "[0-9] +" "3a1b2c1d")

который возвратил бы карту с ключами как положение и значения как соответствия, например.

{0 "3", 2 "1", 4 "2", 6 "1"}

Уже есть ли некоторая реализация этого в существующей библиотеке, или я запишу, это (не должен быть, также может строки кода)?

10
задан Gabriel Mitchell 16 July 2010 в 05:37
поделиться

1 ответ

Вы можете получить нужные данные из java.util.regex. Объект Matcher .

user> (defn re-pos [re s]
        (loop [m (re-matcher re s)
               res {}]
          (if (.find m)
            (recur m (assoc res (.start m) (.group m)))
            res)))
#'user/re-pos
user> (re-pos #"\w+" "The quick brown fox")
{16 "fox", 10 "brown", 4 "quick", 0 "The"}
user> (re-pos #"[0-9]+" "3a1b2c1d")
{6 "1", 4 "2", 2 "1", 0 "3"}
10
ответ дан 4 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: