find会抛出带圆括号的regex(如下)的强制转换异常,而不是像“\d+”这样的简单表达式的异常?

3vpjnl9f  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(317)

嗨,我是clojure的新手,对java不是很有经验,我正在努力使用更复杂的正则表达式,代码如下:

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

我想取一个像下面这样的带分隔符的字符串,删除所有非数字,并将剩余的数字Map到一个延迟序列中,这样我就可以对序列中的每个项进行平方运算,并将结果输出到另一个函数中。

"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."

因此,我构建了下面的正则表达式(有点难看)这样做,它似乎是正确的使用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

当我用上述正则表达式替换“\d+”时,我得到以下强制转换异常:
在clojure.core/read-string(core)处打印返回值(classcastexception)时出错。clj:3805). 类clojure.lang.cons不能转换为类java.lang.string(clojure.lang.cons在加载程序'app'的未命名模块中);java.lang.string位于加载程序“bootstrap”的模块java.base中)
我已经试着进一步研究这个问题,但我没有取得任何进展,有人能解释一下我做错了什么,我应该做什么吗?非常感谢,谢谢

ezykj2lf

ezykj2lf1#

(read-string (re-seq re x)) 没什么意义。 re-seq 返回一个序列,然后 read-string 读取字符串。这些不匹配,因此无论发生什么,您得到的错误都是预期的 re 以及 x 是。
令人惊讶的是,你声称你的第一个例子是有效的。显然不应该,当我将它复制到一个新的repl中时,我发现它确实不起作用。请确保在请求帮助时包含实际失败的代码。如果你编辑它以确保它是最小的(一个好主意!),确保编辑后错误仍然可以再现。

相关问题