首页 > 解决方案 > Clojure/Java.regex:为什么重新查找带括号的正则表达式(如下)的抛出异常,而不是像“\ d +”这样的简单表达式?

问题描述

嗨,我是 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 似乎是正确的 我已经制作了这个多行并添加了注释以提高可读性,但在代码中使用时是单行。

 (\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 中)

我试图进一步阅读这个问题,但我没有取得任何进展,有人会好心解释我做错了什么以及我应该做什么吗?将不胜感激,谢谢

标签: javaregexclojure

解决方案


(read-string (re-seq re x))没有什么意义。re-seq返回一个序列,并read-string读取一个字符串。这些不匹配,所以你得到的错误是预期的,不管是什么rex是。

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


推荐阅读