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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:06:05