Clojure/Java.regex:为什么 re-find 会为我带括号的正则表达式(如下)抛出异常,而不是像“\d+”这样的简单表达式?

时间:2021-01-04 18:32:42

标签: java regex clojure

嗨,我是 Clojure 的新手,对 Java 不是很有经验,我正在努力使用更复杂的 RegEx 和以下代码:

(defn clean-input [s]
  (read-string (re-find #"\d+" s)))
(defn map-numbers [s]
  (map clean-input (clojure.string/split s #" ")))

(map-numbers "1 2 3/3 4 5")
;=> (1 2 3 4 5)

我想要一个像下面这样的分隔字符串并删除所有非数字并将剩余的数字映射到一个惰性序列中,这样我就可以对序列中的每个项目进行平方并将结果输出到另一个函数中。

>
"1 2 3.2 4/4 ff 32.12342e+12 red 1.79769313486231570e+308d 0.001 32/3 0xe22A23 9C5.FF3B645A1C16 0556 0xff 0XFF 0x1f 0x223323223 hg 76 ghg6667  2r1111  32r34a32 33r35545 123."

所以我构建了下面的(有点难看的)RegEx 这样做,使用 regexr.com 似乎是正确的我制作了这个多行并添加了注释以提高可读性,但在代码中使用时是单行。< /em>

 (\d+\.\d+(e(-|\+)\d+)?)                             ;floats and scientific notation
|(\d+\/\d+)                                          ;fractions
|(0(x|X)([A-Fa-f]|\d)+)                              ;hex
|(([2-9]|[1-2][0-9]|3[0-2])(r|R)(([A-Za-z]|\d)+))    ;radix(ish) 
|(\d+)                                               ;int and oct

当我用上面的 RegEx 替换 "\d+" 时,我得到以下转换异常:

在 clojure.core/read-string (core.clj:3805) 打印返回值 (ClassCastException) 时出错。 类 clojure.lang.Cons 不能转换为类 java.lang.String (clojure.lang.Cons 位于加载器“app”的未命名模块中;java.lang.String 位于加载器“bootstrap”的模块 java.base 中)

我已经尝试进一步研究这个问题,但没有取得任何进展,有人愿意解释我做错了什么以及我应该做什么吗? 将不胜感激, 谢谢

1 个答案:

答案 0 :(得分:2)

(read-string (re-seq re x)) 没什么意义。 re-seq 返回一个序列,而 read-string 读取一个字符串。这些不匹配,因此无论 rex 是什么,您都会得到预期的错误。

令人惊讶的是,您声称您的第一个示例有效。显然不应该,当我将它复制到一个新的 repl 时,我发现它确实不起作用。请确保在寻求帮助时包含实际失败代码。如果您对其进行编辑以确保其最小(这是个好主意!),请确保在编辑后错误仍然可以重现。