在Swift中将字符串减少为字母、数字和空格而不使用正则表达式的最简单方法是什么



我目前有一个函数,其目的是从字符串中删除所有非字母、数字或空格的字符。但坦率地说,我讨厌regex,因为它是一只丑陋的恐龙。我想要一种更快捷的方式来处理这个功能。有吗?

func cleanName(_ name: String) -> String {
let negated = "[^A-Za-z0-9 ]+"
return name.replacingOccurrences(of: negated, with: "", options: [.regularExpression])
}
let name = "@$%ab_049*🍄"
print(cleanName(name)) // ab049

您可以组合使用Swift 5或后面的Character属性,如isLetterisWholeNumberisWhitespace,并过滤有效字符:

func cleanName(_ name: String) -> String {
name.filter{ $0.isLetter || $0.isWholeNumber || $0.isWhitespace }
}

另一个选项是使用模式匹配运算符:

func cleanName(_ name: String) -> String {
name.filter{ "0"..."9" ~= $0 || "A"..."Z" ~= $0 || "a"..."z" ~= $0 || $0 == " " } 
}

注意:注意isLetter不等价于[A-Za-z]。对于一些特殊字符和常规字母表,它将返回true。从文档中,以下字符都是字母:

•"A"(U+0041拉丁大写字母A(
?"é"(U+0.065拉丁小写字母E,U+0301组合锐音符(
•"ϴ"日"(U+65E5中日韩统一象形文字-65E5(
•"ᚨ"(U+16A8 RUNIC字母ANSUZ A(


isWholeNumber字符属性也是如此。从文档中,以下字符都表示整数:

•"1"(U+0031 DIGIT ONE(=>1
•"५"(U+096B DEVANAGARI DIGIT FIVE(=>5
•"๙"(U+0E59泰国数字九(=>9
•"万"(U+4E07中日韩统一象形图4E07(=>10_000


因此,如果您想在帖子中获得正则表达式的相同行为,您可以扩展Character并创建自己的计算属性,使其仅对a-z、a-z或0-9中的字符返回true:

extension Character {
var isAlphabet: Bool { "a"..."z" ~= self || "A"..."Z" ~= self }
var isDigit: Bool { "0"..."9" ~= self }
var isAlphaNumeric: Bool { isAlphabet || isDigit }
var isAlphaNumericOrSpace: Bool { isAlphabet || isDigit || self == " " }
} 

您还可以扩展StringProtocol并创建一个自定义属性来清理您的字符串:

extension StringProtocol where Self: RangeReplaceableCollection {
var cleanedUp: Self {
filter(.isAlphaNumericOrSpace)
}
}

用法:

let name = "@$%ab_049*🍄"
name.cleanedUp  // ab049

最新更新