我必须检测字符串是否包含任何特殊字符。我怎么检查呢? Swift是否支持正则表达式?
var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")
if (searchTerm!.rangeOfCharacterFromSet(characterSet).location == NSNotFound){
println("Could not handle special characters")
}
我尝试了上面的代码,但只有当我将第一个字符作为特殊字符输入时才匹配。
答案 0 :(得分:77)
您的代码检查字符串中的字符是否来自给定集合。 你想要的是检查给定集合中
if (searchTerm!.rangeOfCharacterFromSet(characterSet.invertedSet).location != NSNotFound){
println("Could not handle special characters")
}
您也可以使用正则表达式实现此目的:
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]
匹配范围A-Z中不的字符,
a-z或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")
}
答案 1 :(得分:6)
这个答案可以帮助那些使用 Swift 4.1
的人func hasSpecialCharacters() -> Bool {
do {
let regex = try NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: .caseInsensitive)
if let _ = regex.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSMakeRange(0, self.count)) {
return true
}
} catch {
debugPrint(error.localizedDescription)
return false
}
return false
}
从@Martin R的回答中引用。
答案 2 :(得分:5)
反转你的字符集会起作用,因为在你的字符集中你有所有有效的字符:
var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")
if (searchTerm!.rangeOfCharacterFromSet(characterSet.invertedSet).location == NSNotFound){
println("No special characters")
}
希望这会有所帮助.. :)
答案 3 :(得分:3)
@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!
,因为我们可以确定它会创建一个正则表达式,它不会基于任何动态类型的数据
答案 4 :(得分:3)
密码验证以下内容: - (密码长度至少为八个字符,一个特殊字符,一个大写字母,一个小写字母和一个数字)
var isValidateSecialPassword : Bool {
if(self.count>=8 && self.count<=20){
}else{
return false
}
let nonUpperCase = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZ").inverted
let letters = self.components(separatedBy: nonUpperCase)
let strUpper: String = letters.joined()
let smallLetterRegEx = ".*[a-z]+.*"
let samlltest = NSPredicate(format:"SELF MATCHES %@", smallLetterRegEx)
let smallresult = samlltest.evaluate(with: self)
let numberRegEx = ".*[0-9]+.*"
let numbertest = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
let numberresult = numbertest.evaluate(with: self)
let regex = try! NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: NSRegularExpression.Options())
var isSpecial :Bool = false
if regex.firstMatch(in: self, options: NSRegularExpression.MatchingOptions(), range:NSMakeRange(0, self.count)) != nil {
print("could not handle special characters")
isSpecial = true
}else{
isSpecial = false
}
return (strUpper.count >= 1) && smallresult && numberresult && isSpecial
}
答案 5 :(得分:2)
根据特殊字符的定义,您可以使用:
let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789"
chars.canBeConvertedToEncoding(NSASCIIStringEncoding)
答案 6 :(得分:1)
使用 Swift 5 ,您可以做到
if let hasSpecialCharacters = "your string".range(of: ".*[^A-Za-z0-9].*", options: .regularExpression) != nil {}
答案 7 :(得分:0)
两种解决方案:
1)
extension String {
var stripped: String {
let okayChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ")
return self.filter {okayChars.contains($0) }
}
}
2)
class TrimDictionary {
static func trimmedWord(wordString: String) -> String {
var selectedString = wordString
let strFirst = selectedString.first
let strLast = selectedString.last
let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
if strFirst?.description.rangeOfCharacter(from: characterset.inverted) != nil {
selectedString = String(selectedString.dropFirst())
}
if strLast?.description.rangeOfCharacter(from: characterset.inverted) != nil {
selectedString = String(selectedString.dropLast())
}
return selectedString
}
}
答案 8 :(得分:0)
可以通过在正则表达式子句中使用inversion(^)来简化Mahendra的答案。此外,使用caseInsensitive选项时,您不需要A-Z和a-z,因为Swift可以为您解决这种情况:
extension String {
func containsSpecialCharacters(string: String) -> Bool {
do {
let regex = try NSRegularExpression(pattern: "[^a-z0-9 ]", options: .caseInsensitive)
if let _ = regex.firstMatch(in: string, options: [], range: NSMakeRange(0, string.count)) {
return true
} else {
return false
}
} catch {
debugPrint(error.localizedDescription)
return true
}
}
答案 9 :(得分:0)
出于文件名清理的目的,我更喜欢检测无效字符,而不是提供允许的字符集。毕竟,许多非英语用户需要带重音符号。以下功能受this gist的启发:
func checkForIllegalCharacters(string: String) -> Bool {
let invalidCharacters = CharacterSet(charactersIn: "\\/:*?\"<>|")
.union(.newlines)
.union(.illegalCharacters)
.union(.controlCharacters)
if string.rangeOfCharacter(from: invalidCharacters) != nil {
print ("Illegal characters detected in file name")
// Raise an alert here
return true
} else {
return false
}