Clojure中无法用"|"分割字符串?原因及解决方法
问题原因与解决办法
为什么会得到逐个字符的分割结果?
这是因为你用的正则表达式#"|"里的|是正则中的特殊元字符,它代表“交替(alternation)”操作,简单说就是“或”的意思。当你写#"|"时,正则引擎会把它解析成“匹配空字符串或者空字符串”,这就相当于在字符串的每一个字符之间(包括开头和结尾)都进行分割,所以最终会把每个字符(包括|本身)都拆成单独的数组元素。
比如运行:
(clojure.string/split "Hello|World" #"|")
实际得到的是:
["H" "e" "l" "l" "o" "|" "W" "o" "r" "l" "d"]
和你描述的异常结果一致。
如何得到正确的结果?
如果你想要把字符串按|分割成["Hello" "World"],需要把正则中的|转义成普通字符,因为它默认是特殊元字符。有两种常用方式:
使用反斜杠转义:在正则里用
\|表示普通的竖线字符,注意在Clojure的字符串里,反斜杠需要额外转义一次,所以写成#"\|":(clojure.string/split "Hello|World" #"\|") ;; 返回 ["Hello" "World"]使用字符类
[]:把|放在字符类里,它就会被当作普通字符处理,写法更简洁:(clojure.string/split "Hello|World" #[|]) ;; 同样返回 ["Hello" "World"]
如果你确实想要得到["Hello World"](单个元素,把|替换成空格),那其实不需要用split,而是用clojure.string/replace来替换字符:
[(clojure.string/replace "Hello|World" #"[|]" " ")] ;; 返回 ["Hello World"]
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

