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

Ios 检查字符串是否包含Swift中的特殊字符,ios,iphone,regex,swift,nsregularexpression,Ios,Iphone,Regex,Swift,Nsregularexpression,我必须检测字符串是否包含任何特殊字符。我怎么检查?Swift支持正则表达式吗 var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") if (searchTerm!.rangeOfCharacterFromSet(characterSet).location ==

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

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

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

如果字符串中没有来自给定集合的字符,请检查代码。 您需要检查给定集合中是否有任何字符:

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")
}
let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
if searchTerm.rangeOfCharacter(from: characterset.inverted) != nil {
    print("string contains special characters")
}
Swift 3的更新:

let searchTerm = "a+b"

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

反转角色集将起作用,因为在角色集中,您拥有所有有效字符:

var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
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")
}

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

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

let chars =  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

chars.canBeConvertedToEncoding(NSASCIIStringEncoding)

密码验证,包括以下内容:-(密码至少八个字符长、一个特殊字符、一个大写字母、一个小写字母和一个数字)

var isValidateSecialPassword:Bool{
如果(self.count>=8&&self.count=1)&&smallresult&&numberresult&&isSpecial
}

此答案可能会帮助使用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
}
extension String {
    var stripped: String {
        let okayChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        return self.filter {okayChars.contains($0) }
    }
}
参考@Martin R的答案。

两种解决方案:

1)

2)


Mahendra的答案可以通过在regex子句中使用反转(^)来简化一点。此外,在使用不区分大小写选项时,您不需要A-Z和A-Z,因为Swift为您提供了这一可能性:

扩展字符串{
func包含特殊字符(字符串:string)->Bool{
做{
让regex=try NSRegularExpression(模式:“[^a-z0-9]”,选项:。不区分大小写)
如果让ux=regex.firstMatch(in:string,options:[],range:NSMakeRange(0,string.count)){
返回真值
}否则{
返回错误
}
}抓住{
debugPrint(错误。本地化描述)
返回真值
}

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

func checkforillegaracters(string:string)->Bool{
让invalidCharacters=CharacterSet(字符集:“\\/:*?\”))
.union(.newlines)
.union(.非法字符)
.union(.controlCharacters)
如果string.rangeOfCharacter(from:invalidCharacters)!=nil{
打印(“在文件名中检测到非法字符”)
//在这里发出警报
返回真值
}否则{
返回错误
}

使用Swift 5您只需

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

您的检查方式是错误的。如果字符串不包含特殊字符,则会打印“无法处理特殊字符”。现在它是正确的(相当于我的答案中的代码,由于某种原因被否决:)@MartinR>我不知道。但是是的,你和我的解决方案是一样的。不过你得到了两张赞成票。谢谢你指出。使用正则表达式可以实现这一点吗?谢谢你指出。使用正则表达式可以实现这一点吗?谢谢你的回答。但是其他语言呢?@nikolsky:你可以使用
NSCharacterSet。alphanumericCharacterSet()
涵盖所有语言中的字母数字字符。@MartinR谢谢。alphanumericCharacterSet()肯定比使用字符更通用字符串:我认为这并不重要,但警告其他人:这个问题中包含所有字母和数字的字符串有一个额外的“K”(…JKLKM…)。额外的K已通过下面的4个答案传播,这些答案也使用字符串。
if let hasSpecialCharacters =  "your string".range(of: ".*[^A-Za-z0-9].*", options: .regularExpression) != nil {}