我想用 Swift 中的正则表达式匹配一个字符串。我正在按照描述的方法 here .
通常这会像这样工作(在 Xcode playground 中评估):
var str1 = "hello"
var str2 = "bye"
var regex1 = "[abc]"
str1.rangeOfString(regex1, options:.RegularExpressionSearch) != nil // false - there is no match
str2.rangeOfString(regex1, options:.RegularExpressionSearch) != nil // true - there is a match
到目前为止一切顺利。现在让我们取两个字符串,其中包含由多个 Unicode 标量组成的字符(如在 Xcode Playground 中评估的那样):
var str3 = "✔️"
var regex2 = "[✖️]"
"✔️" == "✖️" // false - the strings are not equal
str3.rangeOfString(regex2, options:.RegularExpressionSearch) != nil // true - there is a match!
当我尝试在 "✔️"
中查找 "✖️"
时,我不希望有匹配项,但是因为 "\u{2714}"+ "\u{FE0F}"== "✔️"
和 "\u{2716}"+"\u{FE0F}"== "✖️"
,然后是 "\u{FE0F}"
在两者中都找到并且给出了匹配。
你会如何进行比赛?
最佳答案
深入研究 link由@stribizhev 提供,我想出了这个(在 Xcode playground 中评估):
var str1 = "hello"
var str2 = "bye"
var str3 = "✔️"
var regex1 = "[abc]"
var regex2 = "[✖️]"
let matcher1 = try! NSRegularExpression(pattern: regex1, options: NSRegularExpressionOptions.CaseInsensitive)
let matcher2 = try! NSRegularExpression(pattern: regex2, options: NSRegularExpressionOptions.CaseInsensitive)
matcher1.numberOfMatchesInString(str1, options: NSMatchingOptions.ReportCompletion, range: NSMakeRange(0, str1.characters.count)) != 0 // false - does not match
matcher1.numberOfMatchesInString(str2, options: NSMatchingOptions.ReportCompletion, range: NSMakeRange(0, str2.characters.count)) != 0 // true - matches
matcher2.numberOfMatchesInString(str3, options: NSMatchingOptions.ReportCompletion, range: NSMakeRange(0, str3.characters.count)) != 0 // false - does not match
这适用于 XCode 7.1 和 Swift 2.1
关于regex - 在 Swift 中匹配字符串,其中字符不同但包含相同的 Unicode 标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33302429/