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

问题描述 投票:0回答:12

我必须检测字符串是否包含任何特殊字符。我怎样才能检查它? Swift 支持正则表达式吗?

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

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

ios iphone regex swift nsregularexpression
12个回答
118
投票

您的代码检查字符串中是否没有来自给定集合的字符。 你想要的是检查给定集合中的any字符是否not

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 范围内not的字符, 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")
}

15
投票

使用 Swift 5 你就可以做到

if let hasSpecialCharacters =  "your string".range(of: ".*[^A-Za-z0-9].*", options: .regularExpression) != nil {}

10
投票

这个答案可能会对使用 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的回答。


7
投票

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

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

希望这有帮助..:)


6
投票

密码验证如下:-(密码至少八个字符长,一个特殊字符,一个大写字母,一个小写字母和一个数字)

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
    }

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!
,因为我们可以确定它创建了一个正则表达式,它不基于任何动态类型的数据


3
投票

在 Swift 5 及更高版本中你可以这样做

func validateGenericString(_ string: String) -> Bool {
    return string.range(of: ".*[^A-Za-z0-9].*", options: .regularExpression) == nil
}

检查字符串是否有特殊字符


2
投票

出于文件名清理的目的,我更喜欢检测无效字符,而不是提供允许的字符集。毕竟,许多非英语用户需要重音字符。以下函数的灵感来自于这个要点

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
}

2
投票

根据特殊字符的定义,您可以使用:

let chars =  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

chars.canBeConvertedToEncoding(NSASCIIStringEncoding)

1
投票

两种解决方案:

1)

extension String {
    var stripped: String {
        let okayChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        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
    }
}

0
投票

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
        }
    }


0
投票

我是韩国人。 (不是英文)

/// 다음 문자를 포함하는지 여부
/// !  @  #  $  &  (  )  -  ‘  .  /  +  ,  “ ^ 공백
var hasSpecialChar: Bool {
    if self.isEmpty {
        return false
    }
    do {
        let pattern = "[*\\^\\s!@#$&()\\-`.+,/\"]+"
        let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)
        return regex.matches(in: self, options: [], range: NSRange(location: 0, length: self.count)).count > 0
    } catch {
        return false
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.