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,例如。)