当前位置: 首页 > 知识库问答 >
问题:

Clojure/Java。regex:为什么重新查找带圆括号的regex(如下)而不是像“\d”这样的简单表达式的抛出强制转换异常?

宇文鸣
2023-03-14

您好,我是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)

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

"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.clj:3805)打印返回值(ClassCastException)时出错。类clojure.lang.Cons不能转换为类java.lang.String(clojure.lang.Cons位于loader'app'的未命名模块中;java.lang.String位于loader'bootstrap'的模块java.base中)

我试图进一步了解这个问题,但我没有取得任何进展,有人能解释一下我做错了什么以及我应该做什么吗?非常感谢,谢谢

共有1个答案

单嘉泽
2023-03-14

(读取字符串(re-seq-re-x))没有什么意义re-seq返回一个序列,然后读取字符串。这些不匹配,因此无论re和x是什么,都会出现预期的错误。

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

 类似资料:
  • 编辑:我还尝试打印出,它表示有1。

  • 问题内容: 我正在使用Java 8的新lambda功能,发现Java 8提供的实践确实很有用。但是,我想知道是否有一种 很好的 方法来解决以下情况。假设您有一个对象池包装器,需要某种工厂来填充对象池,例如(使用): 将功能接口转换为lambda表达式后,上面的代码变为: 确实还算不错,但是检查的异常需要在lambda内部加上/ 块。在我公司,我们长时间使用两个接口: 相当于; 还有一个特殊的接口,

  • 我正在玩Java8中的新lambda特性,发现Java8提供的实践确实很有用。然而,我想知道有没有一个好的方法来解决下面的场景。假设您有一个对象池包装器,它需要某种工厂来填充对象池,例如(使用): 将函数接口转换成lambda表达式后,上面的代码变成了这样: null 和都应该在迁移到Java 8期间删除,但是没有完全匹配。如果lambda表达式可以像未检查一样处理检查过的异常,那么可以在上面的构

  • 问题内容: 有没有办法将JavaScript正则表达式转换为Java安全正则表达式? 上面的语句给了我错误: 我对正则表达式不是很熟悉,因此我可以使用一些指导。 谢谢! 问题答案: 摆脱正斜杠。您不需要Java中的代码。而且,Java的正则表达式风格无法识别诸如和的开关。这些由中的常量控制。 在Java世界中唯一有意义的Javascript正则表达式开关是和。它们映射到和(您可以在从类中创建正则表

  • 问题内容: 有人可以帮助我将php regex转换为java regex吗? 太好了,如果您能帮助我,我将不胜感激,因为我对正则表达式的了解不强。 我如何理解php中的函数与Java中的函数相同?。因此在Java代码中将是这样。 但是此代码无法正常工作,因为我怎么知道php中的regex与java不同。 拜托,有人帮我!非常感谢)) 更新 最终结果是 问题答案: 对于此PHP正则表达式: 在Jav

  • 我是jpa的新手,需要这样的东西: 我能修好它吗?