JVM 方法 java.util.regex.Pattern
提供了接受第二个参数(标志)的选项,它是由各种允许的值按位组合而成的。是否考虑过为 clojure.core.re-pattern
函数提供一个类似的参数数量?
例如:
(def rflags {\i java.util.regex.Pattern/CASE_INSENSITIVE
\m java.util.regex.Pattern/MULTILINE
\s java.util.regex.Pattern/DOTALL
\u java.util.regex.Pattern/UNICODE_CASE
\d java.util.regex.Pattern/UNIX_LINES
\x java.util.regex.Pattern/LITERAL
\c java.util.regex.Pattern/CANON_EQ})
(defn re-flags [s]
(reduce bit-or 0 (map #(rflags % 0) s)))
(defn re-pattern
"Returns an instance of java.util.regex.Pattern, for use, e.g. in
re-matcher."
{:tag java.util.regex.Pattern
:added "1.0"
:static true}
([s] (re-pattern s 0))
([s f] (if (instance? java.util.regex.Pattern s)
s
(. java.util.regex.Pattern (compile s f))))
有关此的几点说明
- 大多数这些标志现在可以通过使用 ?
修饰符添加到模式中。例如,可以在字符串的开头添加 (?i)
来使模式不区分大小写。但是,允许标志字符串与JavaScript兼容(并且可以在ClojureScript中实现)
- 目前没有选项定义 LITERAL 或 CANON_EQ,而不直接使用 java.util.regex.Pattern
。
- 目前没有方法在不使用互操作的情况下在ClojureScript中实现任何标志。
- 虽然不是这些标志都与JavaScript兼容,但其中更常用的标志是。同样,JavaScript 允许使用与Java不兼容的标志,因此已经存在小的脱节。
- 对于默认标志传递0确实是java.util.regex.Pattern(String)执行的。