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
相关产品推荐
相关产品推荐

