2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面了解更多关于此工作方式的信息。

+2
in Regex by

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中搜索这些标志的用法,我发现只有少量使用,因此似乎并没有很大的差距。

可能ClojureScript为避免交互而需要的特性才是更大的问题?

我很少需要这些标志,但现在我在进行更多的数据处理,这些标志开始出现,特别是大小写不敏感标志。Clojure过去大量用于数据分析吗?我知道最近对其兴趣日益增长(这也是我尝试使用Clojure而不是仅仅关注Python中的Pandas的原因之一)。

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

我并不是用ClojureScript来做这项工作,但你说的有道理:每次我必须做特定于JVM的事情时,我都会担心这会在ClojureScript中如何表现。
...