Swift中如何提取方括号包裹的子字符串并遍历结果?
如何从字符串中提取方括号内的内容并生成数组?
当然应该用正则!这绝对是处理这类字符串提取需求最简洁可靠的方案,你的思路完全没问题,只是代码里有几个小细节需要调整,我来帮你修正并把整个流程讲清楚:
首先,你写的正则模式里多了前后的/分隔符——在NSRegularExpression里不需要这个,而且方括号是正则中的特殊字符,需要用反斜杠转义,所以正确的模式应该是\\[(.*?)\\]。
下面是完整的可运行代码:
let string = "Users: [Ricky], [Bob], [Jane]" // 转义方括号,非贪婪匹配括号内的内容 let pattern = "\\[(.*?)\\]" do { let regex = try NSRegularExpression(pattern: pattern) // 注意:NSRange是基于UTF-16编码的,所以用string.utf16.count let fullRange = NSRange(location: 0, length: string.utf16.count) // 获取所有匹配结果 let matches = regex.matches(in: string, range: fullRange) // 遍历匹配结果,提取括号内的内容并转成数组 let result = matches.compactMap { match in // range(at:1)对应正则里的捕获分组(也就是括号内的部分) guard let groupRange = Range(match.range(at: 1), in: string) else { return nil } return String(string[groupRange]) } print(result) // 输出 ["Ricky", "Bob", "Jane"] } catch { print("正则表达式初始化失败:\(error.localizedDescription)") }
关键步骤解释:
- 正则
\\[(.*?)\\]:\\[匹配左方括号,(.*?)是非贪婪匹配(确保只抓取到最近的右括号,不会把多个括号内的内容连在一起),\\]匹配右方括号; - 使用
string.utf16.count创建NSRange:因为NSRegularExpression是基于UTF-16编码工作的,如果用utf8.count,遇到emoji这类多字节字符会导致范围计算错误; compactMap遍历匹配结果:每个match的range(at:1)对应我们要的括号内内容,把它转成Swift的Range后提取子字符串,最终过滤掉可能的无效值得到目标数组。
如果你不想用正则,也可以手动遍历字符串来提取(适合简单场景):
let string = "Users: [Ricky], [Bob], [Jane]" var result = [String]() var currentPosition = string.startIndex while let openBracket = string[currentPosition...].firstIndex(of: "[") { let contentStart = string.index(after: openBracket) if let closeBracket = string[contentStart...].firstIndex(of: "]") { let userName = String(string[contentStart..<closeBracket]) result.append(userName) currentPosition = string.index(after: closeBracket) } else { // 遇到不完整的括号,提前终止循环 break } } print(result) // 输出 ["Ricky", "Bob", "Jane"]
不过这种手动方法在字符串格式复杂(比如嵌套括号、括号内包含特殊字符)时,鲁棒性远不如正则,所以还是优先推荐正则方案。
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

