为啥两个不重叠的字符集的交集是非空的?
Posted
技术标签:
【中文标题】为啥两个不重叠的字符集的交集是非空的?【英文标题】:Why is the intersection of two non-overlapping CharacterSets non-empty?为什么两个不重叠的字符集的交集是非空的? 【发布时间】:2017-05-24 23:31:40 【问题描述】:我试图使用 CharacterSet 检查用户输入的字符串是否包含任何非十进制数字字符。我使用CharacterSet.decimalDigits
并将其与用户输入相交。如果这个交集是空的,它可能意味着用户没有输入有效的输入。然而十字路口不是空的。
let digits = CharacterSet.decimalDigits
let letters = CharacterSet(charactersIn: "abcd") // never prints
let intersection = digits.intersection(letters)
for c in "abcd".characters
if intersection.contains(UnicodeScalar(String(c))!)
print("contains \(c)") // never prints
for i in 0...9
if intersection.contains(UnicodeScalar(String(i))!)
print("contains \(i)")
print("intersection is empty: \(intersection.isEmpty)") // prints false
我什至尝试循环遍历所有 unicode 标量来测试成员资格,但这不会打印任何内容。
for i in 0x0000...0xFFFF
guard let c = UnicodeScalar(i) else
continue
if intersection.contains(c)
print("contains \(c)")
为什么集合不为空?
注意使用let digits = CharacterSet(charactersIn: "1234567890")
可以按预期工作。我知道decimalDigits
包含的不仅仅是 0-9,但交集应该仍然是空的。
【问题讨论】:
bugs.swift.org 有几个关于字符集的错误报告。 很好.. 我只是枚举了0x0000...0xFFFF
以查看 .decimalDigits 中的其他字符,我不知道它超过了 0...9
@MathewS:如果您有兴趣:here 是一些(Objective-C 和)Swift 方法,用于从 CharacterSet 中获取所有字符。 “数字”有550个,如“꩓”(CHAM DIGIT THREE)、“໔”(LAO DIGIT FOUR)或“????” (数学双击数字一)
@MartinR 谢谢.. Cham 字母很漂亮!
【参考方案1】:
我浏览了CharacterSet
bugs,并没有看到交叉路口周围错误地报告isEmpty
,所以如果你有时间你应该提交一个错误,因为这是一个很好的可重现示例。
同时,您可以试试这个来检查输入是否包含来自.decimalDigits
characterSet 的任何字符:
let letterInput = CharacterSet(charactersIn: "abcd")
digits.isSubset(of: letterInput.inverted)
// -> true
let letterAndDigitInput = CharacterSet(charactersIn: "abcd 1234")
digits.isSubset(of: letterAndDigitInput.inverted)
// -> false
let digitInput = CharacterSet(charactersIn: "1234")
digits.isSubset(of: digitInput.inverted)
// -> false
【讨论】:
以上是关于为啥两个不重叠的字符集的交集是非空的?的主要内容,如果未能解决你的问题,请参考以下文章