Rex*_*xha 1 regex validation ios swift swiftui
我有一个TextField,我希望用户只输入英文、德文、法文、西里尔文等字母,但不能输入数字或特殊字符(表情符号)。允许有空格。我怎样才能做到这一点?
TextField("First Name", text: $firstName, onEditingChanged: { change in
// validate
})
Run Code Online (Sandbox Code Playgroud)
我见过很多类似的问题,但他们只关心英文字母。
extension String {
var containsLetters : Bool {
let lettersAndSpaces = CharacterSet.letters.union(CharacterSet.whitespaces)
return self.rangeOfCharacter(from: lettersAndSpaces) != nil
}
}
Run Code Online (Sandbox Code Playgroud)
正如您 Filip 所发现的,简短的回答是CharacterSet.letters,它代表所有被 Unicode 视为“字母”或“标记”的 Unicode 代码点。
extension String {
func containsOnlyLettersAndWhitespace() -> Bool {
let allowed = CharacterSet.letters.union(.whitespaces)
return unicodeScalars.allSatisfy(allowed.contains)
}
}
Run Code Online (Sandbox Code Playgroud)
这可能会做你想做的。它涵盖了 Unicode 中每个字母表的每个字母。但它也包括很多不是字母的东西,比如汉字。您的“等...”并不清楚您是否打算包含这些内容,但我怀疑您这样做了。
由于它包含所有标记,幸运的是它可以正确处理组合和分解形式的 é。但它也会考虑 x? 一封信,尽管我很确定它不是任何语言的信。但同样,可能是你的意思,所以没关系。
当然,这意味着它支持 Zalgo,你可能不是这个意思,但同样可能没问题(?):
"Z??????â???l????????????go?????????".containsOnlyLettersAndWhitespace() // true
Run Code Online (Sandbox Code Playgroud)
它还支持一些非法的东西,比如没有字符的组合标记:
let acute = "\u{0301}"
acute.containsOnlyLettersAndWhitespace()
Run Code Online (Sandbox Code Playgroud)
我猜那没问题。
另一方面,一些类似字母的东西不是字母,比如圆圈中的字母:
"?".containsOnlyLettersAndWhitespace() // false
Run Code Online (Sandbox Code Playgroud)
你可能是这个意思,所以很好。
但也有一些事情可能会令人惊讶。例如:
"?".containsOnlyLettersAndWhitespace() // true
Run Code Online (Sandbox Code Playgroud)
这不是感叹号。那是 ?Kung 的字母。再说一次,这可能就是你想要的。但只是警告您,有时人们将信件用于其预期目的以外的用途。
" ? ?? ?".containsOnlyLettersAndWhitespace() // true
"op ?ldo?d s?u??? ???".containsOnlyLettersAndWhitespace() // true
Run Code Online (Sandbox Code Playgroud)
那个“等等……”打开了很多有趣的角落。
由于这是关于 names,这使事情变得非常复杂。我首先会非常仔细地考虑您所说的“真实姓名”是什么意思。我父亲的名字是罗伯特·威廉·纳皮尔二世。他被普遍称为比尔。“比尔”是真名还是假名?什么一致的规则决定了这一点?他一生都在为拒绝“II”作为后缀的系统而烦恼。
“只有字母和空格”打破了很多英文名字。许多常见名称包括句点、连字符和撇号,对于全名,则是逗号。
排除数字也有点冒险。“3rd”是英文“真实”姓名的合法部分。表情符号小组委员会的副主席之一名为 Jennifer 8. Lee。新闻稿中没有句号拼写为“Jennifer 8 Lee”,但她通常用句号来写。以这种方式在数字后面加上句点是很不寻常的,但规则很简单:人们对自己名字的拼写和发音总是正确的。
如果目标是拒绝表情符号,则拒绝表情符号。至少在今天,说“真名”(无论实际含义如何)不包含表情符号可能是有效的。
extension String {
/**
Looks for characters whose default presentation style is emoji, and for
VARIATION SELECTOR-16, which switches to emoji presentation
*/
func containsNoEmoji() -> Bool {
let vs16: Unicode.Scalar = "\u{fe0f}"
return unicodeScalars.allSatisfy {
!$0.properties.isEmojiPresentation && $0 != vs16
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这将拒绝 ,这是一个表情符号,而不是 ?,这是一个 dingbat。
如果你想对名字更严格并拒绝像 Zalgo、文本面孔和“倒置”文本之类的东西,那么你必须准确地了解你支持的文化,研究这些文化如何拼写名字,并实施特定的规则. 例如,为了避免 Zalgo,您可能将英语文化限制为 1 个组合字符,这可能就足够了,并且对于大多数西方使用拉丁语的文化可能已经足够了,但越南语(也是使用拉丁语的语言)至少需要用NFD书写时的两个组合标记。我不知道任何需要更多使用拉丁语的文化,但我不会反对它。你必须研究。
为了避免文字面孔和倒排文字,我可能会再次决定您支持哪些文化,并将字符限制为这些字符集(这很容易实现)。但这意味着明确选择不支持其他文化。这就是选择。也就是说,一些流行的字符,比如COMBINING DOUBLE INVERTED BREVE ( ? )不是我所知道的任何现代语言的一部分。所以你可以排除其中的一些,并且可能会避免大多数你可能试图避免的事情。
我的建议是尽可能接受人们的名字,并且只对导致实际问题的事情写排除,然后尽可能地狭隘地写出来。
| 归档时间: |
|
| 查看次数: |
1084 次 |
| 最近记录: |