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

Swift 5如何过滤字符串 仅提取指定位数(如10位)的数字串

问题原因

原有两种实现无法得到预期结果的核心原因是逻辑本身存在局限性:

  • trimmingCharacters(in:) 仅会处理字符串首尾的符合规则的字符,字符串中间的非数字内容完全不会被过滤,因此才会返回夹杂地址文本的错误结果
  • 按非数字字符拆分后直接拼接所有数字片段的写法,会把所有独立的数字段全部拼接成一个长字符串,根本无法区分不同数字段的长度,最终得到把手机号和门牌号拼在一起的14位字符串。
正确实现

这类按长度提取连续数字串的需求,用正则匹配实现最直接:匹配字符串中所有连续的数字片段,再筛选出长度符合要求的片段即可。
Swift 实现代码如下:

import Foundation

let phoneAddress = "My phone number 2346172891, and my address is Florida 2234"
// 正则匹配所有连续数字段
let digitRegex = try! NSRegularExpression(pattern: "\\d+")
let matchResults = digitRegex.matches(
    in: phoneAddress,
    range: NSRange(phoneAddress.startIndex..., in: phoneAddress)
)

// 筛选长度为10位的数字串
let tenDigitNumbers = matchResults.compactMap { result -> String? in
    guard let matchRange = Range(result.range, in: phoneAddress) else { return nil }
    let numberString = String(phoneAddress[matchRange])
    return numberString.count == 10 ? numberString : nil
}

// 输出结果: ["2346172891"]
print(tenDigitNumbers)

如果需要提取其他长度的数字,直接修改长度判断条件即可;如果待处理文本中存在带分隔符的数字(比如234-617-2891这类带横杠的手机号),可以先执行替换分隔符的操作,再走正则匹配逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:01:00