2

在 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")
4

2 回答 2

5

正则表达式已经允许与|运算符进行交替。

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")
于 2014-01-28T21:32:00.747 回答
4

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

(frak/pattern ["foo" "bar" "baz" "quux"])
;; => #"(?:ba[rz]|foo|quux)"
于 2014-01-29T01:25:27.077 回答