如何在 clojure 中而不是在正则表达式模式下拆分字符串
how to split a string in clojure not in regular expression mode
clojure和java中的split都是以正则表达式作为参数进行split。但我只想使用普通的 char 进行拆分。传入的字符可以是“|”、“、”、“”等。如何用该字符分割一行?
我需要一些函数,例如(拆分字符串 a-char)。而且这个函数的调用频率会很高,所以需要很好的性能。任何好的解决方案。
只需通过正确转义特殊字符并使用默认的正则表达式拆分(这是迄今为止最快的)来使您的角色成为正则表达式。
此版本将制作一个自动转义其中每个字符或字符串的正则表达式
(defn char-to-regex
[c]
(re-pattern (java.util.regex.Pattern/quote (str c))))
如果正则表达式的特殊字符范围内,此版本将生成一个转义单个字符的正则表达式
(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"]
java.util.regex.Pattern
class 中有一些功能支持将字符串视为文字正则表达式。这对于诸如此类的情况很有用。 @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"]
clojure和java中的split都是以正则表达式作为参数进行split。但我只想使用普通的 char 进行拆分。传入的字符可以是“|”、“、”、“”等。如何用该字符分割一行?
我需要一些函数,例如(拆分字符串 a-char)。而且这个函数的调用频率会很高,所以需要很好的性能。任何好的解决方案。
只需通过正确转义特殊字符并使用默认的正则表达式拆分(这是迄今为止最快的)来使您的角色成为正则表达式。
此版本将制作一个自动转义其中每个字符或字符串的正则表达式
(defn char-to-regex
[c]
(re-pattern (java.util.regex.Pattern/quote (str c))))
如果正则表达式的特殊字符范围内,此版本将生成一个转义单个字符的正则表达式
(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"]
java.util.regex.Pattern
class 中有一些功能支持将字符串视为文字正则表达式。这对于诸如此类的情况很有用。 @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"]