如何在clojure中拆分字符串而不是正则表达式模式

时间:2015-02-05 11:18:23

标签: clojure

clojure和java中的分割将正则表达式作为要分割的参数。但我只是想用普通的char来分裂。传入的字符可能是“|”,“,”,“”等等如何用该字符分割一行?

我需要一些功能,如(split string a-char)。并且此功能将以非常高的频率调用,因此需要良好的性能。好的解决方案。

2 个答案:

答案 0 :(得分:5)

java.util.regex.Pattern类中有一些功能支持将字符串视为文字正则表达式。这对于诸如此类的情况很有用。 @cgrand在对另一个答案的评论中已经提到了(Pattern/quote s)。另一个此类功能是LITERAL标记(documented here)。它可以在编译文字正则表达式模式时使用。请记住,Clojure中的#"foo"本质上是(Pattern / compile“foo”)的语法糖。总而言之,我们有:

(import 'java.util.regex.Pattern)
(clojure.string/split "foo[]bar" (Pattern/compile "[]" Pattern/LITERAL))
;; ["foo" "bar"]

答案 1 :(得分:4)

通过正确转义特殊字符并使用默认的正则表达式分割(目前为止最快),让你的角色成为正则表达式。

此版本将生成一个自动转义其中的每个字符或字符串的正则表达式

(defn char-to-regex
  [c]
  (re-pattern (java.util.regex.Pattern/quote (str c))))

如果版本在regexp的特殊字符范围内,则此版本将生成一个逃避单个字符的正则表达式

(defn char-to-regex
  [c]
  (if ((set "<([{\\^-=$!|]})?*+.>") c)
    (re-pattern (str "\\" c))
    (re-pattern c)))

确保绑定正则表达式,因此如果您需要进行多次拆分,请不要反复调用char-to-regex

(let [break (char-to-regex \|)]
  (clojure.string/split "This is | the string | to | split" break))
=> ["This is " " the string " " to " " split"]
相关问题