Ios 检查字符串是否包含Swift中的特殊字符
我必须检测字符串是否包含任何特殊字符。我怎么检查?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 ==
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 {}