我正在尝试从输入字符串中替换坏字符。 字符应该是有效的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 "")
答案 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字符开始。我们首先只打印字母,然后只打印数字,然后是字母或数字。看起来这应该适用于您的问题,虽然我们不会拒绝所需集合的非成员,但我们会保留所需集合的成员。