【问题标题】:how to split a string in clojure not in regular expression mode如何在clojure中拆分字符串而不是正则表达式模式
【发布时间】:2015-02-06 02:37:25
【问题描述】:

clojure 和java 中的split 都以正则表达式为参数进行split。但我只想使用普通字符进行拆分。传入的字符可能是“|”、“、”、“等。如何用该字符分割一行?

我需要一些函数,例如(拆分字符串 a-char)。而且这个函数会被非常高的频率调用,所以需要良好的性能。任何好的解决方案。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    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"]
    

    【讨论】:

      【解决方案2】:

      只需通过正确转义特殊字符并使用默认的正则表达式拆分(这是迄今为止最快的)来使您的角色成为正则表达式。

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

      (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"]
      

      【讨论】:

      • (Pattern/quote s) 比 (str "\\Q" c "\\E") 更可靠
      • 已验证 re: perf,我在 clojure 中制作了一个相对较低级别的字符扫描/拆分版本,但它比正则表达式拆分慢 10 倍。
      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多