Swift技术问询:如何校验字符串适配多语言应用昵称且不含标点数字
适配多语言显示名称校验的解决方案
你好!要让这个校验函数支持所有语言的文字,同时禁止数字和标点符号,我们可以利用Swift内置的Unicode字符集分类来实现,不用再硬编码英文字母范围。下面是改进后的方案:
优化后的代码
func isSuitableForDisplayName(inputString: String) -> Bool { // 先移除所有空白字符(和原逻辑保持一致,避免全空格的无效输入) let mergedString = inputString.replacingOccurrences(of: "\\s", with: "", options: .regularExpression) // 允许的字符:所有Unicode标准中的字母/表意文字(覆盖全球所有语言) let allowedChars = CharacterSet.letters // 明确禁止的字符:数字、标点、符号、空白(双重保险) let forbiddenChars = CharacterSet.decimalDigits .union(.punctuationCharacters) .union(.symbols) .union(.whitespacesAndNewlines) // 校验逻辑:没有非允许字符,同时没有禁止字符,且处理后字符串非空 guard mergedString.rangeOfCharacter(from: allowedChars.inverted) == nil, mergedString.rangeOfCharacter(from: forbiddenChars) == nil, !mergedString.isEmpty else { return false } return true }
核心逻辑说明
CharacterSet.letters:这个集合包含了所有Unicode定义的字母类字符,不管是中文、日文、韩文、俄文、阿拉伯文还是欧洲小语种的字母,都能被正确识别,完美解决多语言支持的问题。- 我们主动合并了所有需要禁止的字符类型:数字、标点、各类符号以及空白字符,确保这些内容完全无法通过校验。
- 额外增加了非空检查,避免用户输入全空格这类无效内容(原逻辑中如果输入全空格,处理后是空字符串,这里直接返回
false更合理)。 - 原代码里的
stringByRemovingWhitespaces是自定义方法,这里用系统的正则替换实现了更通用的空白移除,兼容性更好。
测试用例参考
- ✅ 有效输入:
"张三"、"Luna"、"タロウ"、"Александр" - ❌ 无效输入:
"Li4"、"Anna!"、"홍길동-"、" "
内容的提问来源于stack exchange,提问作者iamburak




