替换clojure中的多个坏字符

时间:2016-12-21 07:24:46

标签: replace utf-8 clojure

我正在尝试从输入字符串中替换坏字符。 字符应该是有效的UTF-8字符(标签,换行符等都可以)。

但是我无法弄清楚如何更换所有找到的坏字符。

我的解决方案适用于第一个坏人物。

通常没有坏人物。 1/50例有一个坏人。我只是想让我的解决方案万无一失。

(defn filter-to-utf-8-string
  "Return only good utf-8 characters from the input."
  [input]
  (let [bad-characters (set (re-seq #"[^\p{L}\p{N}\s\p{P}\p{Sc}\+]+" input))
        filtered-string (clojure.string/replace input (apply str (first bad-characters)) "")]
    filtered-string))

如何对所有值进行替换工作,而不仅仅是第一个?

我的朋友帮我找到了解决这个问题的方法: 我使用重新模式创建了一个替换过滤器。

让代码当前

filter (if (not (empty? bad-characters))
          (re-pattern (str "[" (clojure.string/join bad-characters) "]"))
          #"")
filtered-string (clojure.string/replace input filter "")

1 个答案:

答案 0 :(得分:1)

这是一个简单的版本:

(ns xxxxx
  (:require
    [clojure.string :as str]
  ))

(def all-chars (str/join (map char (range 32 80))))
(println all-chars)

(def char-L (str/join (re-seq #"[\p{L}]" all-chars)))
(println char-L)

(def char-N (str/join (re-seq #"[\p{N}]" all-chars)))
(println char-N)

(def char-LN (str/join (re-seq #"[\p{L}\p{N}]" all-chars)))
(println char-LN)

all-chars  => " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO"
char-L     => "ABCDEFGHIJKLMNO"
char-N     => "0123456789"
char-LN    => "0123456789ABCDEFGHIJKLMNO"

所以我们从32-80范围内的所有ascii字符开始。我们首先只打印字母,然后只打印数字,然后是字母或数字。看起来这应该适用于您的问题,虽然我们不会拒绝所需集合的非成员,但我们会保留所需集合的成员。