Clojure中的多个正则表达式

sun*_*ots 1 regex clojure clojure-contrib

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

(defn foo [x]
(re-seq #"some means to combine multiple regex")
Run Code Online (Sandbox Code Playgroud)

但我不清楚这是否有效,或这种功能的效率.为了提供可能的正则表达式耦合的示例,可以考虑搜索域名和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)
Run Code Online (Sandbox Code Playgroud)

对于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")
Run Code Online (Sandbox Code Playgroud)

A. *_*ebb 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")
Run Code Online (Sandbox Code Playgroud)

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

(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")
Run Code Online (Sandbox Code Playgroud)

  • 这在大多数情况下都有效,但如果其中一个模式使用编号的捕获组呢?例如,`(.)\ 1 {5}`,用于连续六次匹配任何字符?你添加的额外数据搞乱了群组编号; 你需要使用`(?:`而不仅仅是`(`. (2认同)