为啥我不能在“|”处分开在clojure中[重复]
Posted
技术标签:
【中文标题】为啥我不能在“|”处分开在clojure中[重复]【英文标题】:why cant i split at "|" in clojure [duplicate]为什么我不能在“|”处分开在clojure中[重复] 【发布时间】:2018-11-04 08:35:44 【问题描述】:我试图在 clojure "Hello|World
" 中拆分一个字符串,但是当使用拆分方法 "(clojure.string/split x #"|")
" 时,我得到了一个奇怪的结果,我得到了这个 "[h e l l o | w o r l d]"
。谁能告诉我为什么会这样,我怎样才能把它拆分成[hello world]
?
【问题讨论】:
使用(clojure.string/split "Hello|World" (re-pattern (. java.util.regex.Pattern quote "|")))
which 1)调用Pattern.quote
从字符串“|”创建一个模式,然后2)使用re-pattern
从引用的字符串创建一个正则表达式,然后作为第二个参数传递给clojure.string/split
,然后生成所需的结果["Hello" "World"]
。如果你想让它更漂亮一点,使用(defn re-quoted-pattern [s] (re-pattern (. java.util.regex.Pattern quote s)))
,然后你的代码变成(clojure.string/split "Hello|World" (re-quoted-pattern "|"))
。
@WiktorStribiżew - 如果您可以删除您对此的密切投票,我可以发布上面的评论作为答案。您可能是正确的,从 Java 的角度来看,这个问题是一个 dup,但是这个问题没有标记为 java,并且从 Clojure 的角度来看,没有人解决如何从 Clojure 调用 Pattern.quote
的问题;因此,我相信您的重复关闭应该被撤消。谢谢。
这是一个带有regex
标记的问题。 |
符号是一个众所周知的字符,如果想要将其视为文字字符,则需要转义。无需重新打开。
【参考方案1】:
答案如下:
(str/split "Hello|World" #"|") => ["H" "e" "l" "l" "o" "|" "W" "o" "r" "l" "d"]
(str/split "Hello World" #" ") => ["Hello" "World"]
(str/split "Hello|World" #"\|") => ["Hello" "World"]
在正则表达式中,|
字符很特殊,需要使用反斜杠 \
进行转义。
|
字符是正则表达式中的逻辑运算符,通常用于表示“或”,如“abc|def”:
(str/split "Hello|World" #"e|o") => ["H" "ll" "|W" "rld"]
由于您没有其他任何内容,因此它似乎被解释为“任何东西或任何东西”,因此它与每个字符之间的边界匹配。
See the Java docs 了解更多信息。
【讨论】:
以上是关于为啥我不能在“|”处分开在clojure中[重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在 Luminus (Clojure) 中看到参数不匹配错误?
为啥在 Clojure 的瞬态映射中插入 1000 000 个值会产生一个包含 8 个项目的映射?