为啥我不能在“|”处分开在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 个项目的映射?

为啥 reduce 会在 Clojure 中给出 ***Error?

为啥我不能在 C# 中使用基本构造函数 [重复]

如何在clojure中从vector中连续删除重复值?

为啥我不能在同一类的受保护方法中调用方法[重复]