gpt4 book ai didi

ios - 快速验证允许所有字母,但不能包含特殊字符或数字

转载 作者:行者123 更新时间:2023-12-01 17:46:06 25 4
gpt4 key购买 nike

我有一个TextField,我希望用户仅键入字母,英语,德语,法语,西里尔字母等。但是不能输入数字或特殊字符(表情符号)。允许有空格。我该如何实现?

TextField("First Name", text: $firstName, onEditingChanged: { change in
// validate
})

我见过很多类似的问题,但它们只处理英文字母。
extension String {
var containsLetters : Bool {
let lettersAndSpaces = CharacterSet.letters.union(CharacterSet.whitespaces)
return self.rangeOfCharacter(from: lettersAndSpaces) != nil
}
}

最佳答案

正如Filip所发现的,最简单的答案是CharacterSet.letters,它表示Unicode认为是“字母”或“标记”的所有Unicode代码点。

extension String {
func containsOnlyLettersAndWhitespace() -> Bool {
let allowed = CharacterSet.letters.union(.whitespaces)
return unicodeScalars.allSatisfy(allowed.contains)
}
}

那可能会做您想要的。它涵盖了Unicode中每个字母的每个字母。但这还包括很多不是字母的东西,例如汉字。您的“等...”是否明确指出您是否打算将其包括在内,但我怀疑您确实包括在内。

由于包含所有标记,因此很幸运,它将以合成和分解形式正确处理é。但是即使我很确定它不是任何语言的字母,它也将x视为字母。但是,再一次,可能是您的意思,所以没关系。

当然,这意味着它支持Zalgo,这可能不是您的意思,但再次可能就可以了(?):
"Z̤͑̈́͢ͅâ̭ͭ͝l͔̑̾̐͏͓͓̯̝ͧ̿͋go̧̗͙̳͗ͩ͐͘͜".containsOnlyLettersAndWhitespace()   // true

它还支持一些非法的事情,例如合并没有字符的标记:
let acute = "\u{0301}"
acute.containsOnlyLettersAndWhitespace()

我猜没关系。

另一方面,有些类似字母的东西不是字母,例如圆圈中的字母:
"Ⓐ".containsOnlyLettersAndWhitespace()  // false

您可能就是那个意思,所以很好。

但是,有些事情可能会令人惊讶。例如:
"ǃ".containsOnlyLettersAndWhitespace()  // true

那不是感叹号。那是大公的信。同样,这可能就是您想要的。但是只是警告您,有时人们将字母用于其预定目的以外的用途。
" ͡ ͜ʖ ͡".containsOnlyLettersAndWhitespace() // true
"op ǝldoǝd sƃuᴉɥʇ ǝɥʇ".containsOnlyLettersAndWhitespace() // true

“etc ...”打开了许多有趣的角落。

Since this is about names,这使事情变得非常复杂。首先,我将非常仔细地考虑您所说的“真实姓名”。我父亲的名字叫罗伯特·威廉·纳皮尔二世。他被普遍称为比尔。 “账单”是真名还是假名?哪个一致的规则决定了这一点?他一生都在使用拒绝以“II”作为后缀的系统。

“仅字母和空格”打破了英语中的许多名称。许多常用名称包括句点,连字符和撇号,全名则包括逗号。

排除数字也有点麻烦。 “3rd”是英语中“真实”名称的合法部分。 One of the vice chairs of the Emoji Subcommittee is named Jennifer 8. Lee.新闻稿将其拼写为“Jennifer 8 Lee”,但没有句号,但拼写为 she generally writes it with a period。用这种方式在数字后面加上句点是非常不寻常的,但是规则很简单:人们对自己名字的拼写和发音总是很正确。

如果目标是拒绝表情符号,则拒绝表情符号。至少在今天,说不包括表情符号的“真实姓名”(实际上意味着什么)可能是有效的。
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
}
}
}

请注意,这将拒绝🖤(它是表情符号),而不是❤(这是装饰符号)。

如果您想更严格地使用名称,并拒绝诸如Zalgo,文字头像和“倒置”文字之类的东西,那么您就必须准确地了解所支持的文化,研究这些文化如何拼写名称并实施特定规则。例如,为避免Zalgo,您可能会限制英语语言中的1个组合字符,这可能足够,并且对于大多数西方拉丁语使用的文化可能就足够了,但是越南语(也是拉丁语使用的语言)至少需要用 NFD编写的两个组合标记。我不知道任何使用拉丁文的文化需要更多的东西,但是我不反对这样做。你必须研究。

为避免出现文字表面和文本倒置,我可能会再次决定您支持的文化,并将字符限制为这些字符集(实现起来非常简单)。但这意味着明确选择不支持其他文化。那就是选择。就是说,有些流行字符 COMBINING DOUBLE INVERTED BREVE ( ͡   )并不是我所知道的任何现代语言的一部分。因此,您可以排除其中的一些,并避免使用您可能想避免的大多数事情。

我的建议是尽可能地接受人们的名字,只写出引起实际问题的东西的排除项,然后尽可能地缩小范围。

关于ios - 快速验证允许所有字母,但不能包含特殊字符或数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62159104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com