gpt4 book ai didi

regex - Clojure:获取正则表达式匹配列表

转载 作者:行者123 更新时间:2023-12-04 02:54:20 26 4
gpt4 key购买 nike

也许我做错了,但我试图为特定的正则表达式模式获取字符串中的所有匹配项。我正在使用 re-matcher得到一个 Match 对象,我将它传递给 re-find ,给我( full-string-matchgrouped-text )对。如何获得 Match 对象产生的所有匹配的序列?

在 Clojuresque Python 中,它看起来像:

pairs = []
match = re-matcher(regex, line)

while True:
pair = re-find(match)
if not pair: break
pairs.append(pair)

有什么建议么?

最佳答案

您可能想使用内置的 re-seq Clojure 内置了正则表达式文字。除非你真的有,否则不要弄乱底层的 java 对象。

(doc re-seq)

clojure.core/re-seq
([re s])
Returns a lazy sequence of successive matches of pattern in string,
using java.util.regex.Matcher.find(), each such match processed with
re-groups.



For example:



user> (re-seq #"the \w+" "the cat sat on the mat")
("the cat" "the mat")

作为对后续评论的回答,组捕获将生成一个字符串向量,其中包含匹配中组的每个部分的元素:
user> (re-seq #"the (\w+(t))" "the cat sat on the mat")
(["the cat" "cat" "t"] ["the mat" "mat" "t"])

您可以利用向量是其索引的函数这一优雅事实来提取特定元素。
user> (defn extract-group [n] (fn [group] (group n)))
#'user/extract-group
user> (let [matches (re-seq #"the (\w+(t))" "the cat sat on the mat")]
(map (extract-group 1) matches))
("cat" "mat")

或者你可以解构匹配(这里使用 for 宏来遍历所有匹配,但这也可以在 let 或函数参数绑定(bind)中完成):
user> (dorun 
(for [[m1 m2 m3] (re-seq #"the (\w+(t))" "the cat sat on the mat")]
(do (println "m1:" m1)
(println "m2:" m2)
(println "m3:" m3))))
m1: the cat
m2: cat
m3: t
m1: the mat
m2: mat
m3: t

关于regex - Clojure:获取正则表达式匹配列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3963148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com