You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang中执行不区分重音的字符串比较?

Go语言中不区分大小写和重音的字符串比较方法

要同时实现不区分大小写和不区分重音的字符串比较,你需要先将字符串中的重音字符规范化为无重音形式,再结合大小写不敏感的比较逻辑。以下是具体实现方案:

1. 实现移除重音的工具函数

利用Go标准库的unicode/norm和unicode包,将带重音的字符分解为基础字符+重音标记,再过滤掉重音标记:

import (
    "unicode"
    "unicode/norm"
)

// removeAccents 移除字符串中的所有重音标记
func removeAccents(s string) string {
    var result []rune
    // NFD规范化:将带重音的字符分解为基础字符+非间距标记
    for _, r := range norm.NFD.String(s) {
        // Mn类别表示非间距标记(即重音符号),跳过这类字符
        if unicode.Is(unicode.Mn, r) {
            continue
        }
        result = append(result, r)
    }
    return string(result)
}

2. 组合大小写不敏感比较

将两个字符串先移除重音,再用strings.EqualFold()做不区分大小写的比较:

import "strings"

// equalFoldNoAccent 同时实现不区分大小写和重音的字符串比较
func equalFoldNoAccent(a, b string) bool {
    aClean := removeAccents(a)
    bClean := removeAccents(b)
    return strings.EqualFold(aClean, bClean)
}

3. 测试示例

import "fmt"

func main() {
    fmt.Println(equalFoldNoAccent("Montreal", "montreal"))   // 输出: true
    fmt.Println(equalFoldNoAccent("Montréal", "montreal"))   // 输出: true
    fmt.Println(equalFoldNoAccent("Montréal", "MONTREAL"))   // 输出: true
    fmt.Println(equalFoldNoAccent("Café", "cafe"))           // 输出: true
}

原理说明

  • norm.NFD:将Unicode字符分解为规范分解形式,比如é会被拆分为基础字符e加上重音标记´。
  • unicode.Mn:匹配Unicode中的非间距标记(重音、变音符号等),过滤后就得到了无重音的基础字符。
  • strings.EqualFold():原本用于不区分大小写的字符串比较,结合移除重音的逻辑后,就能实现双重不敏感的比较。

内容的提问来源于stack exchange,提问作者dhamu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:15:04