关于clojure:如何在ClojureScript中获取正则表达式匹配的位置?

How can I get the positions of regex matches in ClojureScript?

在Clojure中我可以使用类似这样的解决方案:用于正则表达式匹配的紧凑Clojure代码及其在字符串中的位置,即创建re-matcher并从中提取信息,但重新匹配器似乎不在ClojureScript中实现。 在ClojureScript中完成同样的事情有什么好方法?

编辑:

我最后编写了一个补充函数,以便保留正则表达式的修饰符,因为它被吸收到re-pos中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defn regex-modifiers
 "Returns the modifiers of a regex, concatenated as a string."
  [re]
  (str (if (.-multiline re)"m")
       (if (.-ignoreCase re)"i")))

(defn re-pos
 "Returns a vector of vectors, each subvector containing in order:
   the position of the match, the matched string, and any groups
   extracted from the match."
  [re s]
  (let [re (js/RegExp. (.-source re) (str"g" (regex-modifiers re)))]
    (loop [res []]
      (if-let [m (.exec re s)]
        (recur (conj res (vec (cons (.-index m) m))))
        res))))

您可以使用JS RegExp对象的.exec方法。 返回的匹配对象包含index属性,该属性对应于字符串中匹配的索引。

目前clojurescript不支持使用g模式标志构造正则表达式文字(请参阅CLJS-150),因此您需要使用RegExp构造函数。 以下是链接页面中re-pos函数的clojurescript实现:

1
2
3
4
5
6
7
8
9
10
11
(defn re-pos [re s]
  (let [re (js/RegExp. (.-source re)"g")]
    (loop [res {}]
      (if-let [m (.exec re s)]
        (recur (assoc res (.-index m) (first m)))
        res))))

cljs.user> (re-pos"\\w+""The quick brown fox")
{0"The", 4"quick", 10"brown", 16"fox"}
cljs.user> (re-pos"[0-9]+""3a1b2c1d")
{0"3", 2"1", 4"2", 6"1"}