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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27703039/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 04:09:41  来源:igfitidea点击:

Check if string contains special characters in Swift

iosiphoneregexswiftnsregularexpression

提问by iPhone Guy

I have to detect whether a string contains any special characters. How can I check it? Does Swift support regular expressions?

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

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

I tried the code above, but it matches only if I enter the first character as a special character.

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

回答by Martin R

Your code check if no character in the string is from the given set. What you want is to check if anycharacter is notin the given set:

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

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

You can also achieve this using regular expressions:

您还可以使用正则表达式来实现这一点:

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")

}

The pattern [^A-Za-z0-9]matches a character which is notfrom the ranges A-Z, a-z, or 0-9.

该模式[^A-Za-z0-9]匹配的字符不在范围 AZ、az 或 0-9 中。

Update for Swift 2:

Swift 2 更新:

let searchTerm = "a+b"

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

Update for Swift 3:

Swift 3 更新:

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

回答by Mahendra

This answer may help the people who are using Swift 4.1

这个答案可能对使用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
}

Taken reference from @Martin R's answer.

参考@Martin R 的回答。

回答by Rashad

Inverting your character set will work, because in your character set you have all the valid characters:

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

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

Hope this helps.. :)

希望这可以帮助.. :)

回答by Ilesh P

Password validation With following:- (Password at least eight characters long, one special character, one uppercase, one lower case letter and one digit)

密码验证 使用以下内容:-(密码至少八位字符,一位特殊字符,一位大写字母,一位小写字母和一位数字)

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
    }

回答by Ali

With Swift 5you can just do

使用Swift 5,您可以做到

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

回答by Julian Król

@Martin R answer is great, I just wanted to update it (the second part) to Swift 2.1 version

@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")
}

I used try!as we can be sure it create a regex, it doesn't base on any dynamic kind of a data

我使用try!我们可以确定它创建了一个正则表达式,它不基于任何动态类型的数据

回答by MirekE

Depending on the definition of special characters, you could use this:

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

let chars =  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789"

chars.canBeConvertedToEncoding(NSASCIIStringEncoding)

回答by kishor0011

Two Solutions:

两种解决方案:

1)

1)

extension String {
    var stripped: String {
        let okayChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ")
        return self.filter {okayChars.contains(
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
    }
}
) } } }

2)

2)

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

回答by Strafe86

Mahendra's answer can be stripped down a bit by using an inversion(^) within the regex clause. Additionally, you don't need A-Z and a-z when using the caseInsensitive option, as Swift covers that eventuality for you:

Mahendra 的答案可以通过在正则表达式子句中使用倒置(^)来稍微精简一下。此外,在使用 caseInsensitive 选项时您不需要 AZ 和 az,因为 Swift 为您涵盖了这种可能性:

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
}

回答by Ron Regev

For the purpose of filename sanitization, I prefer to detect the invalid characters, rather than provide an allowed character set. After all, many non-English speaking users need accented characters. The following function is inspired by this gist:

出于文件名清理的目的,我更喜欢检测无效字符,而不是提供允许的字符集。毕竟,许多非英语用户需要重音字符。以下功能受此要点启发:

##代码##