如何实现反转字符串不改变特殊字符位置,优先使用正则表达式
Swift 实现字符串反转且保留特殊字符位置的方案
实现思路
需求核心是仅反转单词中的英文字母顺序,数字、符号等非字母字符的位置完全保持不变,优先用正则实现的话可以按以下步骤处理:
- 按空格分割原字符串为独立单词,分别对每个单词做处理
- 用正则
[a-zA-Z]提取单个单词中所有的英文字母 - 将提取到的字母序列反转
- 遍历原单词的每一位字符:如果是字母就取反转序列里的下一个字母填充,非字母直接保留原字符
- 所有单词处理完成后用空格拼接回完整字符串
完整实现代码
func reverseTheWord(_ input: String) -> String { // 按空格拆分原始字符串为单词数组 let wordList = input.components(separatedBy: " ") let processedWordList = wordList.map { singleWord in // 正则匹配所有大小写英文字母 let letterRegex = try! NSRegularExpression(pattern: "[a-zA-Z]") // 提取当前单词中所有英文字母 let allLetters = letterRegex.matches(in: singleWord, range: NSRange(singleWord.startIndex..., in: singleWord)) .compactMap { matchResult in Range(matchResult.range, in: singleWord) } .map { range in singleWord[range] } // 生成反转后的字母迭代器,方便按顺序取用 var reversedLetterIterator = allLetters.reversed().makeIterator() // 逐个字符处理生成新单词 var processedSingleWord = "" for char in singleWord { if char.isLetter { processedSingleWord.append(reversedLetterIterator.next()!) } else { processedSingleWord.append(char) } } return processedSingleWord } // 拼接处理后的单词为完整字符串返回 return processedWordList.joined(separator: " ") }
代码说明
- 正则
[a-zA-Z]精准匹配所有大小写英文字母,符合优先使用正则的要求 - 这里的
try!可以放心使用:因为正则是固定写的合法表达式,不会出现匹配错误 - 全程保留原字符串中非字母字符的位置,完全符合示例要求
测试验证
给出的三个测试用例运行结果完全符合预期:
- 输入:
Weather is cool 24/7→ 输出:rehtaeW si looc 24/7 - 输入:
abcd efgh→ 输出:dcba hgfe - 输入:
a1bcd efg!h→ 输出:d1cba hgf!e
内容的提问来源于stack exchange,提问作者Sima
相关产品推荐
相关产品推荐

