Swift 5.7中如何实现忽略变音符号的正则匹配?
Swift 5.7 正则变音符号匹配相关问题解答
为什么没有内置ignoresDiacritic()方法
- 你用到的
ignoresCase()本质是对正则通用标准里i(大小写不敏感)修饰符的封装,这个能力是所有主流正则实现都支持的,规则全球统一,所以官方直接做成了开箱即用的链式方法。 - 变音符号不敏感匹配完全和本地语言规则绑定,不同国家、不同语种对带变音字符的等价判定差异极大,不存在全球通用的统一规则。如果直接做一个无参数的
ignoresDiacritic()方法,默认逻辑根本没法适配所有地区的语言习惯,很容易出现不符合预期的匹配错误,所以官方暂时没把这个能力直接挂到Regex的链式方法上。
是否推荐先移除字符串变音符号再匹配
推荐。目前Swift 5.7的Regex类型没有直接开放变音不敏感的匹配开关,先对原字符串做变音归一化预处理,再走正则匹配,是现阶段兼容性最好、性能表现稳定的方案,不会干扰正则本身的匹配逻辑。
两种预处理方案的效果对比
优先选folding(options: .diacriticInsensitive, locale: .current),两种方案的实际差异很明确:
applyingTransform(.stripDiacritics, reverse: false)的逻辑是硬套Unicode转换规则,把所有组合式变音标记直接删掉,完全不考虑当前语言的特殊规则。有些语言里的带变音字符本身是独立字符,不是基础字符加变音标记拼出来的,这个方法很容易转换出错;而且它返回的是可选值,示例里的强制解包在极端场景下存在崩溃风险。folding(options: .diacriticInsensitive, locale: .current)是专门为字符串不敏感比较设计的API,会跟着传入的本地化参数适配对应语种的变音等价规则,在法语、土耳其语、越南语这类大量使用变音符号的语言场景下,匹配结果更符合本地用户的使用常识;同时它直接返回确定的String类型,不需要解包,代码健壮性更高。
两种方案的基础用法参考:
// 剥离变音符号方案(不推荐) "Lorem ÏPSÛM dolor." .applyingTransform(.stripDiacritics, reverse: false)! .contains(/ipsum/.ignoresCase()) // true // 本地化变音折叠方案(推荐) "Lorem ÏPSÛM dolor." .folding(options: .diacriticInsensitive, locale: .current) .contains(/ipsum/.ignoresCase()) // true
补充细节:如果你的匹配不需要针对特定地区做适配,也可以给locale传
nil,会走通用的Unicode变音折叠规则,性能比带本地化参数的版本稍高。
内容的提问来源于stack exchange,提问作者parapote
相关产品推荐
相关产品推荐

