re-matches 函数不具有正确的语义:它对字符串进行搜索(而不是匹配)并在字符串和匹配字符串不相等时返回 nil。这不同于真正的匹配,就像在模式开始和结束时插入 "^" 和 "$" 一样。
Clojure 示例
user=> (re-find #"0|[1-9][0-9]+|0[xX][0-9a-zA-Z]+" "0x1") "0" user=> (re-matches #"0|[1-9][0-9]+|0[xX][0-9a-zA-Z]+" "0x1") "0x1"
与 Clojurescript 比较
ClojureScript:cljs.user> (re-find #"0|[1-9][0-9]+|0[xX][0-9a-zA-Z]+" "0x1") "0" ClojureScript:cljs.user> (re-matches #"0|[1-9][0-9]+|0[xX][0-9a-zA-Z]+" "0x1") nil
这(之一)是 CLJS-775 的原因。
我并不完全确定在这里要做什么。我首先想到的是让 re-matches 检查其正则表达式输入的 -source 属性,用 "^$" 包装字符串,然后仔细地将所有标志复制到一个新的正则表达式。
问题
1. 有没有任何有效的模式在做这件事时不安全?例如,我们能否在前面放置 "^" 的位置?"^^abc$$" 好吗?
1. 如果 "^" 和 "$" 已经是模式的第一个和最后一个字符,我们能否避免克隆?
1. 如果有所涉及,多行模式对此有何影响?
1. regexinstance.lastIndex 是正则表达式实例(或在旧浏览器上!)的可变性的一部分,它在相同字符串上的多次 exec() 调用时用作字符串偏移量。我完全没有主意如果 re-* 获得设置了全局标志的正则表达式要怎么做。(顺便说一句,这是拒绝 CLJS-150 的一个非常好的理由:允许 clojure 接受全局标志会让正则表达式对象具有状态,并完全破坏 re-seq 等。)