Replace 替换clojure中的多个坏字符

Replace 替换clojure中的多个坏字符,replace,utf-8,clojure,Replace,Utf 8,Clojure,我正在尝试替换输入字符串中的坏字符。 字符应为有效的UTF-8字符(制表符、换行符等都可以) 但是,我无法找出如何替换所有发现的坏字符 我的解决方案适用于第一个坏角色 通常没有坏角色。1/50的情况下,有一个坏性格。我只想让我的解决方案万无一失 (defn filter-to-utf-8-string “仅从输入中返回正确的utf-8字符。” [输入] (让[错误字符(设置)(重新排序“[^\p{L}\p{N}\s\p{p}\p{Sc}\+]+”输入)) 筛选字符串(clojure.string

我正在尝试替换输入字符串中的坏字符。 字符应为有效的UTF-8字符(制表符、换行符等都可以)

但是,我无法找出如何替换所有发现的坏字符

我的解决方案适用于第一个坏角色

通常没有坏角色。1/50的情况下,有一个坏性格。我只想让我的解决方案万无一失

(defn filter-to-utf-8-string
“仅从输入中返回正确的utf-8字符。”
[输入]
(让[错误字符(设置)(重新排序“[^\p{L}\p{N}\s\p{p}\p{Sc}\+]+”输入))
筛选字符串(clojure.string/replace输入(应用str(第一个坏字符))“”)
过滤字符串)
我如何使replace按顺序为所有值工作,而不仅仅是第一个值


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

在let中,代码当前为

过滤器(如果(不是(空?坏字符))
(重新模式(str“[”(clojure.string/join bad characters)”))
#"")
筛选字符串(clojure.string/replace input filter“”)

以下是一个简单的版本:

(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"
(ns xxxxx)
(:需要
[clojure.string:as str]
))
(定义所有字符(str/join(映射字符(范围32-80)))
(打印所有字符)
(def char-L(str/join(re-seq#“[\p{L}]”所有字符)))
(println char-L)
(def char-N(str/join(re-seq#“[\p{N}]”所有字符)))
(println char-N)
(def char LN(str/join(re-seq#“[\p{L}\p{N}]”所有字符)))
(打印项次字符项次)
所有字符=>“!\”#$%&'()*+,-./0123456789:@ABCDEFGHIJKLMNO“
char-L=>“ABCDEFGHIJKLMNO”
char-N=>“0123456789”
字符LN=>“0123456789ABCDEFGHIJKLMNO”

因此,我们从32-80范围内的所有ascii字符开始。我们首先只打印字母,然后只打印数字,然后是字母或数字。这似乎可以解决您的问题,尽管我们不拒绝所需集合的非成员,而是保留所需集合的成员。

我想我将为第一个t提出另一个问题显然,过滤器是误导性的。实际上,我想知道如何使用map或reduce来完成(第一个坏字符)部分。