如何对使用区域设置的丹麦名称使用Regex名称验证?



中进行区域设置。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"))

在第一种情况下,我使用土耳其语言环境来比较iI,不区分大小写。比较失败是因为在土耳其,小写I看起来像这样:ı(U+0131 LATIN SMALL DOTLESS I)。

在第二种情况下,我做了同样的事情,但使用了正则表达式。它成功匹配I。这表明,如果使用正则表达式,它将完全忽略区域设置。

如果我明白你想做什么正确,Locale.exemplarCharacterSet可能对你有用。对于大多数语言来说,它包含了该语言书写系统中的所有字符。您可能需要逐个检查string中的每个unicode标量,而不是使用正则表达式。

Regexes可以用p检查Unicode属性,但是特定语言的字母太具体了。例如,丹麦字母中的所有字母都具有脚本属性Latin,但许多非丹麦字母也具有此属性,例如无点i。

最新更新