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

如何从含负数的数学表达式字符串中提取数字?

提取含负数的数学表达式中的数字

你当前用components(separatedBy:)的方式没法区分作为负号的-和作为运算符的-,所以会把开头的-当成分隔符,导致分割出空字符串,同时丢失负数的符号。

推荐用正则表达式来匹配数字,直接提取符合规则的结果,这是最可靠的方式:

实现代码(Swift)

let mathString = "-6-9"
// 正则规则:匹配可选负号开头,后跟一个或多个数字(支持整数;若需小数可改为 "-?\\d+\\.?\\d*")
guard let regex = try? NSRegularExpression(pattern: "-?\\d+") else {
    fatalError("正则表达式无效")
}

let matches = regex.matches(in: mathString, range: NSRange(mathString.startIndex..., in: mathString))
let numbersArray = matches.map {
    String(mathString[Range($0.range, in: mathString)!])
}

print(numbersArray) // 输出:["-6", "9"]

正则规则说明

  • -?:匹配0个或1个负号,确保能捕获负数和正数
  • \\d+:匹配一个或多个数字,对应整数;如果需要支持小数(比如-3.14、5.2),可以把规则修改为"-?\\d+\\.?\\d*"

备选方案:使用Scanner

如果不想用正则,也可以用Scanner手动处理运算符和数字的边界:

let mathString = "-6-9"
let scanner = Scanner(string: mathString)
var numbersArray = [String]()
let operators = CharacterSet(charactersIn: "+x/")

while !scanner.isAtEnd {
    // 跳过除负号外的运算符
    if scanner.scanCharacters(from: operators) != nil {
        continue
    }
    // 扫描到下一个运算符之前的内容(包含开头的负号)
    if let numberStr = scanner.scanUpToCharacters(from: operators.union(CharacterSet(charactersIn: "-"))) {
        numbersArray.append(numberStr.trimmingCharacters(in: .whitespaces))
    } else {
        // 处理最后一段数字(比如表达式末尾的数字)
        let remaining = String(mathString[scanner.currentIndex...])
        numbersArray.append(remaining)
        break
    }
}

print(numbersArray) // 输出:["-6", "9"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:48:22