请在2024 Clojure 状态调查!分享您的想法。

欢迎!请访问关于页面以了解更多关于如何操作的信息。

+2
正则表达式

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) 的行为

2 个回答

+1
0

我不清楚当时在实现re相关功能时(或当时的功能是什么)考虑了什么。

在Clojure中搜索 相关内容,我只看到这些标志在Clojure中仅有少量使用,因此似乎并不存在重大缺口。

可能是ClojureScript避免交互的需要更大吗?

过去我很少需要这些标志,但现在随着我进行更多的数据处理,它们开始出现,尤其是大小写不敏感标志。Clojure以往是否常用于数据分析?我知道最近对其兴趣增长(这也是我尝试使用它的原因之一,而不仅仅专注于Python中的Pandas)。

我在Python和Clojure之间切换,所有的Python `re` 函数都接受一个 `flags` 参数。这也是JavaScript和 `sed` 中的一个常见扩展,所以当我在Clojure中需要它时,我惊讶地发现它没有。我需要使用交互操作或者查阅Java文档以了解嵌入式代码 `(?i)`。

我没有用ClojureScript做这些工作,但你说的有道理:每次我必须做一些特定的JVM工作,我总是在担心这将在ClojureScript中如何表现。
...