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 中实现任何标志目前没有直接的方法,除非使用 interop。
- 虽然并不是所有这些标志都与 JavaScript 兼容,但更常见的是。同样,JavaScript 允许标志不完全与 Java 兼容,因此已经存在一些不兼容的地方。
- 为默认标志传递 0 的行为确实是java.util.regex.Pattern(String) 的行为。