Clojure中的多个正则表达式

时间:2014-01-28 21:10:48

标签: regex clojure clojure-contrib

在Clojure函数中耦合多个正则表达式的最佳方法是什么?我相信这个功能可以这样开始:

(defn foo [x]
(re-seq #"some means to combine multiple regex")

但不清楚这是否有效,或这种功能的效率。为了提供可能的正则表达式耦合的示例,可以考虑搜索域名和IP的函数。对于域名,我使用正则表达式:

(re-seq #"\b([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}\b" x)

和IP:

(re-seq #"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b")

2 个答案:

答案 0 :(得分:6)

正则表达式已允许与|运算符交替使用。

user=> (re-seq #"\d+" "123 foo 345 bar")
("123" "345")
user=> (re-seq #"[a-zA-Z]+" "123 foo 345 bar")
("foo" "bar")
user=> (re-seq #"\d+|[a-zA-Z]+" "123 foo 345 bar")
("123" "foo" "345" "bar")

如果需要,您可以通过插入|运算符以编程方式联合正则表达式模式。

(defn union-re-patterns [& patterns] 
    (re-pattern (apply str (interpose "|" (map #(str "(" % ")") patterns)))))

user=> (union-re-patterns #"\d+" #"[a-zA-Z]+")
#"(\d+)|([a-zA-Z]+)"
user=> (map first (re-seq (union-re-patterns #"\d+" #"[a-zA-Z]+") "123 foo 345 bar"))
("123" "foo" "345" "bar")

答案 1 :(得分:4)

根据您的使用情况,frak可能就是您要搜索的内容; frak将字符串集合转换为正则表达式以匹配这些字符串:

(frak/pattern ["foo" "bar" "baz" "quux"])
;; => #"(?:ba[rz]|foo|quux)"