如何从含负数的数学表达式字符串中提取数字?
提取含负数的数学表达式中的数字
你当前用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
相关产品推荐
相关产品推荐

