Swift中如何基于正则从字符串提取指定格式的数组?
解决方案
提供两种可直接落地的实现方式:
方案1:正则匹配(代码简洁)
核心思路是使用正则同时匹配两种合法单元:括号包裹的带空格坐标、无空格的普通字符段。
正则规则为 \([^)]*\)|\S+,含义:
- 匹配所有以
(开头、)结尾的子串,中间允许包含除)外的任意字符(含空格) - 或匹配连续的非空格字符段
Swift 实现代码:
import Foundation let inputString = "1*1 (10, 10) (5, 5)" // OC 语法的正则需要多一层转义反斜杠 let pattern = "\\([^)]*\\)|\\S+" let regex = try! NSRegularExpression(pattern: pattern) let fullRange = NSRange(inputString.startIndex..., in: inputString) let resultArray = regex.matches(in: inputString, range: fullRange).map { match in String(inputString[Range(match.range, in: inputString)!]) } // 输出结果:["1*1", "(10, 10)", "(5, 5)"] print(resultArray)
注:该正则规则固定不会出错,可安全使用try!,如果需要严格异常处理可自行包裹do-catch。
方案2:手动遍历字符(无正则依赖、可扩展性强)
核心思路是通过括号状态标记,只拆分括号外的空格,括号内的空格直接保留。
Swift 实现代码:
func splitCustomString(_ str: String) -> [String] { var result = [String]() var currentSegment = "" var isInParentheses = false for char in str { switch char { case "(": isInParentheses = true currentSegment.append(char) case ")": isInParentheses = false currentSegment.append(char) case " " where !isInParentheses: guard !currentSegment.isEmpty else { break } result.append(currentSegment) currentSegment.removeAll() default: currentSegment.append(char) } } // 处理最后一段剩余字符 if !currentSegment.isEmpty { result.append(currentSegment) } return result } // 调用示例 let inputString = "1*1 (10, 10) (5, 5)" let resultArray = splitCustomString(inputString) // 输出结果:["1*1", "(10, 10)", "(5, 5)"] print(resultArray)
该方案后续如果需要适配中括号、大括号等其他包裹符,只需扩展isInParentheses的状态判断逻辑即可。
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

