嗨,我是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中)
我已经试着进一步研究这个问题,但我没有取得任何进展,有人能解释一下我做错了什么,我应该做什么吗?非常感谢,谢谢
1条答案
按热度按时间ezykj2lf1#
(read-string (re-seq re x))
没什么意义。re-seq
返回一个序列,然后read-string
读取字符串。这些不匹配,因此无论发生什么,您得到的错误都是预期的re
以及x
是。令人惊讶的是,你声称你的第一个例子是有效的。显然不应该,当我将它复制到一个新的repl中时,我发现它确实不起作用。请确保在请求帮助时包含实际失败的代码。如果你编辑它以确保它是最小的(一个好主意!),确保编辑后错误仍然可以再现。