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

