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

如何使用正则表达式将字符串拆分为相同字符的分组?

解决Swift中正则拆分连续相同字符分组的问题

你的需求是把连续相同字符组成的字符串拆分成对应分组数组,但当前的正则表达式存在明显错误,我来帮你修正并给出完整的实现方案:

原正则的问题分析

你写的\\ b([1,][a-z])\\完全不符合需求:

  • \\b是单词边界,这里我们不需要匹配单词边界,反而会干扰连续字符的匹配
  • [1,]是匹配数字1或者逗号,和你的大写字母字符串完全不相关
  • [a-z]仅匹配小写字母,但你的目标字符串是大写字母,而且没有处理连续重复的逻辑

正确的正则表达式

我们需要匹配一个任意字符,加上后续零个或多个和它相同的字符,对应的正则模式是:

(.)\1*
  • (.):捕获第一个任意字符(作为分组1)
  • \1*:反向引用分组1的内容,匹配零个或多个和它相同的字符,这样就能把连续的相同字符全部匹配到

Swift完整实现代码

下面是可以直接运行的Swift代码,同时处理了可能的正则错误,避免强制解包导致崩溃:

var string = "AAAAAAABBBCCCCCCDD"
let pattern = "(.)\\1*"

do {
    // 初始化正则表达式
    let regex = try NSRegularExpression(pattern: pattern, options: [])
    // 获取所有匹配结果
    let matches = regex.matches(
        in: string,
        options: [],
        range: NSRange(string.startIndex..., in: string)
    )
    // 将匹配结果转换为字符串数组
    let resultArray = matches.compactMap { match -> String? in
        guard let swiftRange = Range(match.range, in: string) else {
            return nil
        }
        return String(string[swiftRange])
    }
    
    print(resultArray) // 输出: ["AAAAAAA", "BBB", "CCCCCC", "DD"]
} catch {
    print("正则表达式初始化失败:\(error.localizedDescription)")
}

代码关键点说明

  1. 使用do-catch替代try!:正则表达式如果写错会抛出错误,try!会直接崩溃,用do-catch能优雅处理错误
  2. 转换NSRange到Swift Range:NSRegularExpression返回的是NSRange,需要转换成Swift原生的Range才能正确截取字符串
  3. compactMap处理可选值:确保每个匹配结果都能正确转换为字符串,过滤掉无效的匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:31:54