当前位置:首页 > 文章列表 > Golang > Go教程 > Go x/text/runes Remove 怎样删除指定字符集合

Go x/text/runes Remove 怎样删除指定字符集合

来源:17golang原创 2026-10-27 03:56:17 0浏览 收藏

Go 的 runes.Remove 接收一个字符集合 Set,删除其中命中的 Unicode 码点。对于少量指定字符,可以用 runes.Predicate 构造判断函数,再调用返回的 Transformer.String 得到新字符串;它处理的是 UTF-8 文本中的 rune,不是某段子字符串。

官方文档入口:https://pkg.go.dev/golang.org/x/text/runes。本文用“仅删除下划线和中点”的导入显示名作为例子,说明字符规则、输入和清理结果如何关联,不把删除操作扩大成通用文本修复。

先约定哪些字符可以删除

假设显示名由外部系统导入,业务明确要求去掉 ASCII 下划线 _ 和中点 ·,中文、字母、空格与其他标点保持原有内容。这个约定可以表达成两个 rune 的集合,清理发生在生成展示副本时,原始文本另行保留。

先定义删除集合,可以避免“删除标点”这样的宽泛规则误伤人名或编号。空格是否可以删除、全角下划线是否也在范围内,都需要单独约定。图中的规则配置、下划线、中点、Predicate、Remove、展示副本对应这一输入契约。

规则配置包含两个字符,Predicate 与 Remove 的静态依赖
结构图:删除集合限定具体码点,Remove 依赖集合判断生成展示副本。

用 Predicate 描述精确字符集合

下面给出可放入项目的最小函数。依赖通过项目 go.mod 管理,使用与当前工具链兼容的 x/text 版本。每次函数调用创建转换器,调用方不需要管理复用状态。

package displayname

import (
    "fmt"
    "unicode/utf8"

    "golang.org/x/text/runes"
)

// CleanDisplayName 只删除约定的下划线与中点,保留其他码点。
func CleanDisplayName(input string) (string, error) {
    // 在转换前拒绝非法 UTF-8,避免把修复后的文本误当作原文。
    if !utf8.ValidString(input) {
        return "", fmt.Errorf("显示名不是有效 UTF-8")
    }
    unwanted := runes.Predicate(func(r rune) bool {
        // true 表示属于待删除集合,false 表示保留。
        return r == '_' || r == '·'
    })
    cleaner := runes.Remove(unwanted)
    return cleaner.String(input), nil
}

按这段规则,示例输入 仓_库·北区 A 的预期结果为 仓库北区 A,其中空格保留。这里是代码语义示例,没有声称已经执行。不要给 String 接收两个返回值:runes.Transformer.String 的签名直接返回 string,与 transform.String 的多返回值接口不同。

Remove 的官方说明把删除条件定义为 Set.Contains(r);Predicate 把判断函数封装成 Set。判断函数应只描述集合归属,不依赖调用次数或字符之前的位置。涉及相邻字符或整段匹配时,应另外选择适合该规则的处理方式。

输入合法性与清理结果分别处理

输入字节是否构成合法 UTF-8,与某个 rune 是否需要删除,是两个不同问题。Remove 会先把非法输入字节按 RuneError 处理后再进行集合判断;因此它不适合充当“发现输入异常就拒绝”的完整入口。本例在调用之前使用 utf8.ValidString,明确选择拒绝非法编码。

这不是要求所有清理任务必须拒绝异常输入。如果业务允许修复,应在契约中说明替换行为并保留原始输入;不要通过把 RuneError 加入删除集合来掩盖源数据问题,因为原文也可能合法包含 U+FFFD。

依据 utf8.ValidString 文档,它判断字符串是否完全由合法 UTF-8 编码的 rune 组成。这个判断不保证字段符合业务格式,也不会自动处理规范化、大小写和人类可见字符的组合。

保留原文与规则版本的对应关系

删除是有损操作,结果不适合替代所有用途的原文。例如 仓_库 和 仓库 都可能得到同一个展示副本。若业务以清理结果做查重键,需要明确这种合并是否允许,而不是默认它们代表同一实体。

原文、规则版本、展示副本与查询字段的记录关系
结构图:原文和规则版本用于追溯,展示副本与查询字段承担不同用途。

可以在应用记录中保留“原始文本”“规则版本”“展示副本”“查询字段”,再由展示组件读取展示副本,追溯记录关联原始文本与规则版本。图中的六个节点是数据设计示意,不是本包自动创建的数据表。

对象建议用途
原始文本保留来源,供规则调整后重新生成
规则版本区分删除集合变更前后的含义
展示副本页面展示,不默认作为唯一标识
查询字段依据检索需求单独定义生成规则

入库时让这些字段与当前记录保持一致,更新删除集合后再决定哪些旧记录需要重新生成。不要对清理后的字节偏移继续套用原文位置,删除字符会改变后续位置。展示副本也不等于 HTML 转义后的安全输出,呈现时仍应采用目标格式的正常编码方式。

常见删除需求怎样选择

怎样删除 Unicode 某一类字符?可以把对应 unicode.RangeTable 交给 runes.In,再传给 Remove。但范围可能远大于几个明确标点,使用前先确认该分类与业务契约一致。

只想删除开头和结尾的字符怎么办?Remove 会删除整个字符串内命中的 rune,不区分首尾。首尾裁剪应使用相应字符串裁剪方法,不要直接用这个函数替代。

能否一次删除整段词语?Predicate 的参数只有当前 rune;把词语的每个字放进集合,会删掉这些字在其他位置的出现,不能表达整段词语匹配。

删除后为什么视觉形态变了?rune 是码点层面的单位,部分可见字符由多个码点组成。删除组合标记可能改变文字含义,Remove 本身不会自动完成规范化或按用户感知字符分组。应先把删除范围缩小到已确认的码点,再决定是否需要专门的文本规则。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go x/text/number Decimal 怎样控制最小小数位Go x/text/number Decimal 怎样控制最小小数位
上一篇
Go x/text/number Decimal 怎样控制最小小数位
Go x/text/search Pattern 怎样复用多次文本查找
下一篇
Go x/text/search Pattern 怎样复用多次文本查找
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    722次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    731次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    805次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    768次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    606次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码