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

Swift中如何移除字符串末尾数字(保留开头数字)?

解决方法:删除字符串中非开头的数字部分,保留开头数字

你遇到的问题是因为trimmingCharacters(in: .decimalDigits)只会移除字符串两端的数字,而不是中间那些独立的数字序列,而且它会把开头的数字也删掉,完全不符合你的需求。下面给你两种可行的解决方案:

方案一:使用正则表达式(简洁高效)

我们可以用正则表达式匹配并替换所有非开头的、由空格分隔的纯数字部分。这个正则表达式的思路是:只替换那些不在字符串开头的、前面带有空格的数字序列,这样就能保留开头的数字,同时删掉后面的数字。

修改后的代码如下:

func parseHTML(html: String) { 
    if let doc = try? HTML(html: html, encoding: .utf8) { 
        for show in doc.css("ul[class^='topic'] li a"){ 
            guard let text = show.text else { continue } // 避免强制解包,提升代码安全性
            // 先去掉字符串两端的空白字符
            let trimmedText = text.trimmingCharacters(in: .whitespacesAndNewlines)
            // 正则表达式:匹配非开头的、空格后的纯数字
            let pattern = "(?<!^)\\s+\\d+"
            let processedString = trimmedText.replacingOccurrences(of: pattern, with: "", options: .regularExpression)
            goster.append(processedString) 
        }
    }
}

正则表达式解释:

  • (?<!^):负向零宽断言,表示当前位置不是字符串的开头,确保我们不会误删开头的数字
  • \\s+:匹配一个或多个空格(用来定位数字前面的分隔符)
  • \\d+:匹配一个或多个数字

测试一下效果:

  • 输入 "swift 23 ios 36 iphone 25" → 输出 "swift ios iphone"
  • 输入 "25 january 2018" → 输出 "25 january"
  • 输入 "11 september 2001" → 输出 "11 september"

方案二:分割字符串后过滤(直观易读)

如果你对正则不太熟悉,可以把字符串分割成单词数组,然后过滤掉非开头的纯数字单词,最后再拼接成字符串:

func parseHTML(html: String) { 
    if let doc = try? HTML(html: html, encoding: .utf8) { 
        for show in doc.css("ul[class^='topic'] li a"){ 
            guard let text = show.text else { continue }
            let trimmedText = text.trimmingCharacters(in: .whitespacesAndNewlines)
            let words = trimmedText.components(separatedBy: .whitespaces)
            var processedWords = [String]()
            
            for (index, word) in words.enumerated() {
                if index == 0 {
                    // 第一个单词直接保留,不管是不是数字
                    processedWords.append(word)
                } else {
                    // 非第一个单词:如果不是纯数字就保留,纯数字则跳过
                    if !word.allSatisfy({ $0.isNumber }) {
                        processedWords.append(word)
                    }
                }
            }
            
            let processedString = processedWords.joined(separator: " ")
            goster.append(processedString) 
        }
    }
}

这个方法的逻辑非常直观,容易理解和修改,比如如果之后需求有变化(比如要保留某些特定数字),调整起来更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:56:59