检查string是否包含Swift中的特殊字符

我必须检测一个string是否包含任何特殊字符。 我如何检查它? Swift支持正则expression式吗?

var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789") if (searchTerm!.rangeOfCharacterFromSet(characterSet).location == NSNotFound){ println("Could not handle special characters") } 

我尝试了上面的代码,但只有当我input第一个字符作为特殊字符时才匹配。

你的代码检查string中的字符是否来自给定的集合。 你想要的是检查是否有任何字符不在给定的集合中:

 if (searchTerm!.rangeOfCharacterFromSet(characterSet.invertedSet).location != NSNotFound){ println("Could not handle special characters") } 

你也可以使用正则expression式来实现这一点:

 let regex = NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: nil, error: nil)! if regex.firstMatchInString(searchTerm!, options: nil, range: NSMakeRange(0, searchTerm!.length)) != nil { println("could not handle special characters") } 

模式[^A-Za-z0-9]匹配不是范围AZ,az或0-9的字符。

Swift 2更新:

 let searchTerm = "a+b" let characterset = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") if searchTerm.rangeOfCharacterFromSet(characterset.invertedSet) != nil { print("string contains special characters") } 

Swift 3的更新:

 let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") if searchTerm.rangeOfCharacter(from: characterset.inverted) != nil { print("string contains special characters") } 

反转你的字符集将起作用,因为在你的字符集中你有所有的有效字符:

 var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789") if (searchTerm!.rangeOfCharacterFromSet(characterSet.invertedSet).location == NSNotFound){ println("No special characters") } 

希望这可以帮助.. :)

@Martin R的答案是伟大的,我只是想更新它(第二部分)到Swift 2.1版本

 let regex = try! NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: NSRegularExpressionOptions()) if regex.firstMatchInString(searchTerm!, options: NSMatchingOptions(), range:NSMakeRange(0, searchTerm!.characters.count)) != nil { print("could not handle special characters") } 

我用了try! 因为我们可以确定它创build了一个正则expression式,它不基于任何dynamictypes的数据

根据特殊字符的定义,你可以使用这个:

 let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789" chars.canBeConvertedToEncoding(NSASCIIStringEncoding)