Clojure:
使用正则表达式
如何操作:
Clojure,作为Lisp家族的一份子,提供了一整套丰富的函数,它们与Java的正则表达式能力无缝接口。以下是如何利用它们:
基本匹配
要检查字符串是否匹配某个模式,使用re-matches
。如果成功,它返回整个匹配;否则返回nil
。
(re-matches #"\d+" "123") ;=> "123"
(re-matches #"\d+" "abc") ;=> nil
搜索模式
要找到模式的第一次出现,re-find
是你要去的函数:
(re-find #"\d+" "Order 123") ;=> "123"
捕获组
使用带有括号的模式和re-find
来捕获组:
(let [[_ area code] (re-find #"(1)?(\d{3})" "Phone: 123-4567")]
(println "Area Code:" area "Code:" code))
;; 输出:Area Code: nil Code: 123
全局搜索(查找所有匹配项)
Clojure没有像某些语言那样的内置全局搜索。相反,使用re-seq
来获取所有匹配项的延迟序列:
(re-seq #"\d+" "id: 123, qty: 456") ;=> ("123" "456")
分割字符串
要基于模式分割字符串,使用clojure.string/split
:
(clojure.string/split "John,Doe,30" #",") ;=> ["John" "Doe" "30"]
替换
用clojure.string/replace
替换匹配某个模式的字符串部分:
(clojure.string/replace "2023-04-01" #"\d{4}" "YYYY") ;=> "YYYY-04-01"
第三方库
尽管Clojure的内置支持在大多数情况下已足够,但对于更复杂的情况,考虑使用如clojure.spec
之类的库,用于健壮的数据验证,以及在Web应用中用正则表达式基于路由和输入验证的反应式DOM操作的reagent
。
;; 使用clojure.spec验证电子邮件的示例
(require '[clojure.spec.alpha :as s])
(s/def ::email (s/and string? #(re-matches #".+@.+\..+" %)))
(s/valid? ::email "[email protected]") ;=> true
记住,虽然正则表达式强大,但它们也可能使代码难以阅读和维护。审慎使用它们,并尽可能考虑使用更简单的字符串操作函数。