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 是正则表达式实例的可变性的一部分(或旧版本浏览器中的 RegExp 全局标志)用于同一字符串的多次 exec() 调用的字符串偏移。我不知道如果 re-* 获取设置全局标志的正则表达式时要做什么。(顺便说一下,这是拒绝 CLJS-150 的一个非常好的理由:允许 clojure 接受全局标志会使正则表达式对象具有状态性,并可能完全破坏 re-seq 等。)