在中进行区域设置。Range方法是否允许自动检测特殊语言字符?
我找不到关于这个的任何信息,它在我的实现中不起作用。如果没有,有没有更好的/其他的方法来增加对不同语言字符的支持?还是将UTF值硬编码为正则表达式是唯一的方法?
问题是,即使我将丹麦字符硬编码到解决方案中,将来它可能需要支持其他语言,那么正确的方法是什么?
import Foundation
func isUserNameValid(userName: String, locale: Locale) -> Bool {
return userName.range(
of: #"(?mi)^[a-z](?!(?:.*.){2})(?!(?:.* ){2})(?!.*.[a-z])[a-z. ]{1,}[a-z]$"#,
options: .regularExpression,
range: nil,
locale: locale) != nil
}
let inputName = "Lærke"
if isUserNameValid(userName: inputName, locale: Locale(identifier: "da-DK")) {
print("valid")
} else {
print("not valid")
}
.range方法中的locale是否允许在特殊语言字符中自动检测?
locale参数用于对语言环境敏感的字符串比较。如果您使用.regularExpression
选项,那么它会完全忽略locale参数,因为现在您的regex指定了应该如何进行比较,而不需要locale。
比较:
// nil
"I".range(of: "i", options: .caseInsensitive, range: nil, locale: Locale(identifier: "tr-TR"))
// not nil
"I".range(of: "(?i)i", options: .regularExpression, range: nil, locale: Locale(identifier: "tr-TR"))
在第一种情况下,我使用土耳其语言环境来比较i
和I
,不区分大小写。比较失败是因为在土耳其,小写I看起来像这样:ı
(U+0131 LATIN SMALL DOTLESS I)。
在第二种情况下,我做了同样的事情,但使用了正则表达式。它成功匹配I
。这表明,如果使用正则表达式,它将完全忽略区域设置。
如果我明白你想做什么正确,Locale.exemplarCharacterSet
可能对你有用。对于大多数语言来说,它包含了该语言书写系统中的所有字符。您可能需要逐个检查string中的每个unicode标量,而不是使用正则表达式。
Regexes可以用p
检查Unicode属性,但是特定语言的字母太具体了。例如,丹麦字母中的所有字母都具有脚本属性Latin
,但许多非丹麦字母也具有此属性,例如无点i。