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 等。)