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

如何使用Swift正则表达式拆分以A开头B结尾的目标字符组?

解决Swift中提取A开头B结尾中间内容的正则问题

你的需求很明确:从字符串里提取所有A开头、B结尾的片段里的中间内容,最终得到["12345678", "88", "883849"]。之前的正则写法确实有问题,咱们一步步来修正。

先说说原来正则的问题

你用的\\.*A.*B有几个致命缺陷:

  • \\.*完全多余,而且.匹配任意字符(包括换行),这里根本不需要
  • .*是贪婪匹配,它会从第一个A直接匹配到最后一个B,最后只能得到一个完整的长匹配,而不是你想要的多个分段
  • 没有设置捕获组,就算匹配到了A...B的片段,也没法直接提取中间的目标内容

正确的解决方案:用捕获组精准匹配

我们需要一个能精准定位A和B之间内容的正则,同时提取出中间部分。推荐用这个正则:A([^B]+)B

正则解释:

  • A:精准匹配开头的字符A
  • ([^B]+):这是核心的捕获组,[^B]表示匹配除了B之外的任意单个字符,+表示匹配一次或多次——这样就能刚好拿到A之后到下一个B之前的所有内容,不会贪婪匹配到后面的B
  • B:精准匹配结尾的字符B

修改后的Swift代码

原来的matches函数需要调整一下,因为我们要提取的是捕获组(也就是括号里的内容),而不是整个匹配的字符串:

func matches(for regex: String, in text: String) -> [String] {
    do {
        let regex = try NSRegularExpression(pattern: regex)
        let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text))
        // 提取第一个捕获组的内容(index=1,index=0是整个匹配)
        return results.compactMap { match in
            guard let captureRange = Range(match.range(at: 1), in: text) else {
                return nil
            }
            return String(text[captureRange])
        }
    } catch let error {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}

let string = "A12345678B119292A88B2222A883849B123"
let pattern = "A([^B]+)B"
let array = matches(for: pattern, in: string)
print(array) // 输出 ["12345678", "88", "883849"]

补充:另一种惰性匹配的写法

如果你习惯用惰性匹配,也可以写成A(.*?)B,不过[^B]+的效率更高——因为它不需要回溯,遇到B就直接停止匹配,而.*?是一步步检查直到遇到B,在长字符串里差异会更明显。

内容的提问来源于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:32:46