当前位置: 首页 > 知识库问答 >
问题:

Clojure中修剪不可打印字符的通用方法

都才俊
2023-03-14

我遇到了一个bug,我无法将两个看似“相同”的字符串匹配在一起。例如,以下两个字符串无法匹配:“sample”和“sample”。

要复制此问题,可以在Clojure中运行以下命令。

(= "sample" "​sample") ; returns false

经过一个小时的沮丧调试,我发现第二串前面有一个零宽度的空格!通过退格键将它从这个例子中删除是微不足道的。然而,我有一个正在匹配的字符串数据库,似乎有多个字符串面临这个问题。我的问题是:Clojure中有没有修剪零宽空格的通用方法

我试过一些方法:

(count (clojure.string/trim "​abc")) ; returns 4
(count (clojure.string/replace "​abc" #"\s" "")) ; returns 4

这个线程从JavaScript字符串中删除零宽度的空格字符确实提供了一个在这个例子中工作的正则表达式的解决方案,即

(count (clojure.string/replace "​abc" #"[\u200B-\u200D\uFEFF]" "")) ; returns 3

然而,正如帖子本身所述,还有许多其他潜在的ascii字符可能是不可见的。因此,我仍然对是否有一种更通用的方法不依赖于列出所有可能的不可见unicode符号感兴趣。

共有2个答案

卢志强
2023-03-14

@Rulle的regex解决方案非常好。图佩罗。chars名称空间还有一组可能有用的字符类和谓词函数。它们在Clojure和ClojureScript中工作,还包括^nbsp 。特别是,查看可见的内容?谓语

图佩罗。字符串名称空间也有许多助手

(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [tupelo.chars :as chars]
    [tupelo.string :as str] ))

(def sss
"Some multi-line
string." )

(dotest
  (println "result:")
  (println
    (str/join
      (filterv
        #(or (chars/visible? %) 
             (chars/whitespace? %))
        sss))))

有结果

result:
Some multi-line
string.

若要使用,请使您的< code>project.clj看起来像这样:

  :dependencies [
                 [org.clojure/clojure "1.10.2-alpha1"]
                 [prismatic/schema "1.1.12"]
                 [tupelo "20.07.01"]
                 ]
太叔逸春
2023-03-14

我相信,你所指的是所谓的不可印刷字符。基于Java中的这个答案,您可以将< code>#"\p{C}"正则表达式作为模式传递给< code>replace:

(defn remove-non-printable-characters [x]
  (clojure.string/replace x #"\p{C}" ""))

但是,这将删除换行符,例如< code>\n。所以为了保留那些字符,我们需要一个更复杂的正则表达式:

(defn remove-non-printable-characters [x]
  (clojure.string/replace x #"[\p{C}&&^(\S)]" ""))

此功能将删除不可打印的字符。让我们来测试一下:

(= "sample" "​sample")
;; => false

(= (remove-non-printable-characters "sample")
   (remove-non-printable-characters "​sample"))
;; => true

(remove-non-printable-characters "sam\nple")
;; => "sam\nple"

这里讨论的是< code>\p{C}模式

 类似资料:
  • 本文向大家介绍如何在Python中修剪掉字符串中不可打印的字符?,包括了如何在Python中修剪掉字符串中不可打印的字符?的使用技巧和注意事项,需要的朋友参考一下 如果只有ASCII字符,并且要删除不可打印的字符,最简单的方法是使用string.printable过滤掉那些字符。例如, 未打印0x01,因为它不是可打印字符。如果还需要支持Unicode,则需要使用Unicode数据模块和正则表达式

  • 问题内容: 有谁知道如何在Java中检测可打印字符? 一段时间(试用/错误)后,我得到了这种方法: 我通过KeyListener获取输入,然后按Ctr-“键”打印一个正方形。有了这个功能似乎还足够。 我在这里缺少一些字符吗? 问题答案: 看来这是“字体”的独立方式。

  • 问题内容: 如何修剪Java中的字符? 例如 j 应该是 “乔\吉尔” j 应该是 “ \ joe \ jill \” 等等 问题答案: Apache Commons 有一个很棒的StringUtils类(org.apache.commons.lang.StringUtils)。其中有一种方法可以满足您的需求。 我强烈建议无论如何都要使用Apache Commons,尤其是Collections和

  • 问题内容: 我过去跑步 在Perl上摆脱不可打印的字符。 在Python中,没有POSIX正则表达式类,因此我无法编写[:print:]来表示我想要的含义。我不知道在Python中无法检测字符是否可打印。 你会怎么做? 编辑:它也必须支持Unicode字符。string.printable方式会很乐意将它们从输出中剥离。curses.ascii.isprint将为任何unicode字符返回fals

  • 这是用C++语言编写的代码。 为什么在第一个cout语句中,程序尝试打印直到它找到一个空字符,而在第二个语句中,它只打印一个字符?

  • 问题内容: 给定的字符串为“ _home sweet home __* ”,如果用户输入模式为0,则o / p应为“ home sweet home_ _” __‘如果用户输入模式为1,则o / p应该为’ *_home sweet home”(如果用户将模式输入为2,则o / p应为“ home sweet home”)。 码 我想找到给定字符串中空格的总数。 问题答案: 试试这个