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