如何在Clojure中比较两个正则表达式?

4

我正在为一个构建正则表达式的函数进行单元测试,但是使用=不起作用。我该如何测试它是否返回了正确的正则表达式?

以下是我尝试过的空正则表达式:

(= #"" #"") ; false
(== #"" #"") ; ClassCastException java.util.regex.Pattern cannot be cast to java.lang.Number
(identical? #"" #"") ; false
(.equals #"" #"") ; false

有没有Clojure风格的方法来做这件事,还是我必须将两个正则表达式转换为字符串然后进行比较?
2个回答

5

不幸的是,没有更好的方法,你只能使用字符串

user> (= (str #"foo") (str #"foo"))    
true                                   
user> (= (str #"foo") (str #"fooo"))   
false 

即使如此也不是完美的,因为它不能捕获与看起来不同但匹配相同字符串的正则表达式。
user> (re-seq #"[a]" "aaaa")       
("a" "a" "a" "a")                  
user> (re-seq #"a" "aaaa")         
("a" "a" "a" "a")
user> (= (str #"a") (str #"[a]"))  
false 

这也是为什么你不能比较函数的相等性。我怀疑Clojure没有实现 == 用于正则表达式,因为确定两个正则表达式是否匹配相同的字符串(或某种其他相等性概念)可能不太实用。


(+1 1)和2是两个不同的表达式,但具有相同的值。我们可以把正则表达式的值想象成它所接受的字符串。即使匹配相同字符串的不同正则表达式仍然是不同的表达式。没有算法可以确定两个一般函数表达式是否等价。虽然有算法可以确定两个正则表达式是否等价,但它们是不可解的,即运行时间比多项式更糟糕。 - Thumbnail

0

这与Clojure中的模式(pattern)实际上使用了java.util.regex.Pattern有关。如果您尝试编写一个Java程序来比较两个模式对象,它将再次返回false。

唯一的方法是对正则表达式字符串进行equals操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接