如何拆分含字母与数字的字符串?解决H2/He2拆分丢数字问题
嘿,这个问题我熟!你想把类似"H2"或"He2"这类字符串拆成元素符号和数字的数组,但用components(separatedBy: .decimalDigits)会丢掉数字部分,对吧?我给你两个靠谱的实现方案~
方案一:正则表达式(最简洁高效)
正则可以精准匹配开头的元素符号(大写字母开头,可选后续小写字母)和后面的数字部分,一次性把两部分都提取出来。
func splitElementAndNumber(_ input: String) -> [String] { // 正则模式:匹配开头的元素符号 + 可选的数字部分 let pattern = #"^([A-Z][a-z]*)(\d*)$"# guard let regex = try? NSRegularExpression(pattern: pattern), let match = regex.firstMatch(in: input, range: NSRange(input.startIndex..., in: input)) else { // 不匹配时返回原字符串(可根据需求调整,比如返回空数组) return [input] } var result = [String]() // 提取元素符号 if let elementRange = Range(match.range(at: 1), in: input) { result.append(String(input[elementRange])) } // 提取数字部分(仅当数字不为空时添加) if let numberRange = Range(match.range(at: 2), in: input), !input[numberRange].isEmpty { result.append(String(input[numberRange])) } return result } // 测试用例 print(splitElementAndNumber("H2")) // 输出: ["H", "2"] print(splitElementAndNumber("He2")) // 输出: ["He", "2"] print(splitElementAndNumber("Na")) // 输出: ["Na"](无数字的情况) print(splitElementAndNumber("Fe")) // 输出: ["Fe"]
方案二:手动遍历字符(适合不想用正则的场景)
如果你对正则不太熟悉,手动遍历字符区分字母和数字也能实现,逻辑更直观:
func splitElementAndNumberManual(_ input: String) -> [String] { guard !input.isEmpty else { return [] } var elementChars = [Character]() var numberChars = [Character]() var hasStartedNumber = false for char in input { if char.isLetter { // 一旦开始收集数字,就停止收集元素符号(因为元素符号永远在数字前面) if hasStartedNumber { break } elementChars.append(char) } else if char.isNumber { hasStartedNumber = true numberChars.append(char) } else { // 遇到非字母数字的字符,直接终止(可根据需求调整处理逻辑) break } } var result = [String(elementChars)] if !numberChars.isEmpty { result.append(String(numberChars)) } return result } // 测试用例 print(splitElementAndNumberManual("H2")) // 输出: ["H", "2"] print(splitElementAndNumberManual("He2")) // 输出: ["He", "2"] print(splitElementAndNumberManual("C")) // 输出: ["C"]
为什么你原来的方法不行?
components(separatedBy: .decimalDigits)的作用是把字符串按数字分割,得到的是数字之间的非数字片段,数字本身会被当作分隔符丢弃。比如处理"H2"时,分割后只能得到["H"],自然拿不到数字部分。我们需要的是匹配并保留元素和数字,而不是分割丢弃数字,所以得用上面的两种思路。
内容的提问来源于stack exchange,提问作者Eugeny
相关产品推荐
相关产品推荐

