Hen*_*rik 4 regex clojure clojurescript
在Clojure中,我可以使用类似这样的解决方案:用于正则表达式匹配的紧凑Clojure代码及其在字符串中的位置,即re-matcher从中创建和提取信息,但重新匹配器似乎不在ClojureScript中实现.在ClojureScript中完成同样的事情有什么好方法?
编辑:
我最后编写了一个补充函数,以便保留正则表达式的修饰符,因为它被吸收到re-pos:
(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))))
Run Code Online (Sandbox Code Playgroud)
您可以使用.execJS RegExp对象的方法.返回的匹配对象包含一个index属性,该属性对应于字符串中匹配的索引.
目前clojurescript不支持使用gmode标志构造正则表达式文字(请参阅CLJS-150),因此您需要使用RegExp构造函数.这是re-pos来自链接页面的函数的clojurescript实现:
(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"}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2066 次 |
| 最近记录: |