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

如何拆分含字母与数字的字符串?解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:00:49