为啥两个不重叠的字符集的交集是非空的?

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

【讨论】:

以上是关于为啥两个不重叠的字符集的交集是非空的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥检查字符串是不是为空的函数总是返回true? [关闭]

PHP计算两个时间段是否有交集(边界重叠不算)

查找两个字符串向量的交集

在 Python Pandas 中查找两列的交集 -> 字符串列表

两个字符串数组的快速 count() 交集

100天算法入门 - 每日三题 - Day14两个数组的交集有效的完全平方数字符串中的第一个唯一字符