如何使用正则表达式将字符串拆分为相同字符的分组?
解决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)") }
代码关键点说明
- 使用
do-catch替代try!:正则表达式如果写错会抛出错误,try!会直接崩溃,用do-catch能优雅处理错误 - 转换NSRange到Swift Range:
NSRegularExpression返回的是NSRange,需要转换成Swift原生的Range才能正确截取字符串 compactMap处理可选值:确保每个匹配结果都能正确转换为字符串,过滤掉无效的匹配
内容的提问来源于stack exchange,提问作者user9174501
相关产品推荐
相关产品推荐

