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中实现任何标志,而不使用互操作性。
- 虽然并非所有这些标志都与JavaScript兼容,但其中更常见的一些是。类似地,JavaScript允许与Java不兼容的标志,因此已经存在一个小型的差异。
- 为默认标志传递0实际上是java.util.regex.Pattern(String)what

2 个答案

+1
0

我不知道当时在实现re相关功能时都考虑了什么(或者功能有哪些)。

在Clojure中搜索相关内容,我仅看到这些flag被使用了几次,因此似乎并不会造成很大的差距。

或许ClojureScript避免交互操作的需求更为关键?

以前很少需要这些flag,但现在因为数据处理的增多,这种感觉越来越明显,特别是大小写不敏感的flag。Clojure过去是否在数据分析方面被广泛使用?我知道最近人们对它的兴趣日益增长(这也是我尝试使用Clojure而不是仅仅专注于Python中的Pandas的原因之一)。

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

我并没有在ClojureScript中做任何这项工作,但你的观点是有道理的:每次我需要处理特定的JVM相关任务时,我都会关注这些内容在ClojureScript中的表现。
...