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

2 个回答

+1
0

我不知道在re相关功能实现的时候,(或者有哪些功能是可用的)都被考虑到了。

搜索 周围的 我只见到了在Clojure中少数使用这些标记,所以这似乎不是一个大的空缺。

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

我很少需要这些标记,但现在我做更多的数据处理,这开始引起注意,尤其是不区分大小写的标记。Clojure过去在数据分析中使用得很多吗?我知道最近人们对它越来越感兴趣(这也是我尝试使用它而不是仅仅关注Python中的Pandas的原因之一)。

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

我并不用ClojureScript来做这项工作,但你说的有道理:每当我要做JVM特定的事情,我总是担心它在ClojureScript中会怎样。
...