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

Swift正则提取字符串中src=至.m3u8结尾的子串

Swift正则提取src=开头、.m3u8结尾的子串:验证与优化

原代码存在的问题

  • 仅通过firstMatch获取第一个匹配结果,无法提取示例中多个符合条件的子串
  • 正则表达式src=(.*?).m3u8的.*?非贪婪匹配可能误捕获分隔符(如&),导致结果包含无效内容
  • range构造存在语法错误(嵌套NSRange),且没必要从第4位开始匹配
  • 多处强制解包(try!、!)会在匹配失败或range转换失败时引发崩溃

优化后的实现方案

1. 精准正则表达式

使用src=([^&]+)\.m3u8替代原正则:

  • [^&]+表示匹配除&之外的任意字符,避免捕获URL参数分隔符后的内容
  • 保持.caseInsensitive适配大小写场景

2. 完整代码实现

let string = "loremipsum-src=https://loremipsum.m3u8&pano-src=https://loremimpum.m3u8&proj"
var m3u8Urls: [String] = []

do {
    // 修正正则表达式,精准匹配URL内容
    let regex = try NSRegularExpression(pattern: "src=([^&]+)\\.m3u8", options: .caseInsensitive)
    let fullRange = NSRange(string.startIndex..., in: string)
    
    // 获取所有匹配结果
    let matches = regex.matches(in: string, range: fullRange)
    
    for match in matches {
        // 安全转换NSRange为Swift String.Index范围
        if let captureRange = Range(match.range(at: 1), in: string) {
            let urlString = String(string[captureRange])
            m3u8Urls.append(urlString)
        }
    }
    
    print(m3u8Urls)
    // 输出: ["https://loremipsum.m3u8", "https://loremimpum.m3u8"]
} catch {
    print("正则表达式初始化失败: \(error.localizedDescription)")
}

关键优化点说明

  • 改用matches(in:range:)获取所有匹配,满足多结果提取需求
  • 正则使用[^&]+精准限制匹配范围,避免无效内容
  • 用do-catch处理正则初始化错误,移除强制解包
  • 安全转换NSRange为Swift字符串范围,避免崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:41:42