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
相关产品推荐
相关产品推荐

