文字列に特殊文字が含まれているかどうかを検出する必要があります。どうすれば確認できますか? Swift=は正規表現をサポートしていますか?
var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")
if (searchTerm!.rangeOfCharacterFromSet(characterSet).location == NSNotFound){
println("Could not handle special characters")
}
上記のコードを試しましたが、最初の文字を特殊文字として入力した場合にのみ一致します。
コードは、文字列内の文字が指定されたセットに含まれていないかどうかをチェックします。あなたが望むのは、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、a〜z、または0〜9の範囲のnotでない文字に一致します。
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")
}
この回答は、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の回答からの引用。
文字セットにはすべての有効な文字があるため、文字セットの反転は機能します。
var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")
if (searchTerm!.rangeOfCharacterFromSet(characterSet.invertedSet).location == NSNotFound){
println("No special characters")
}
お役に立てれば.. :)
以下のパスワード検証:-(少なくとも8文字のパスワード、1つの特殊文字、1つの大文字、1つの小文字、1つの数字)
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
}
@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!
を使用しました。これは正規表現を作成することが確実であるため、動的な種類のデータに基づいていません
特殊文字の定義に応じて、これを使用できます。
let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789"
chars.canBeConvertedToEncoding(NSASCIIStringEncoding)
2つのソリューション:
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
}
}