I\'ve got a string that needs to be only a-z, 0-9 and _
How do I check if the input is valid? I\'ve tried this but it accepts letter like å,ä,ö,ø etc.
NS
this is a quick helper if it helps
-(BOOL)isString:(NSString *)s{
char letter = 'A';
//BOOL isLetter=NO;
for (int i=0; i<26; i++) {
NSString *temp = [NSString stringWithFormat:@"%c",letter+i];
if ([s isEqualToString:temp]) {
return YES;
}
}
return NO;
}
You can use a predicate:
NSString *myRegex = @"[A-Z0-9a-z_]*";
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", myRegex];
NSString *string = nameField.text;
BOOL valid = [myTest evaluateWithObject:string];
Edit:
I don't noticed that you are using [NSString stringWithString:nameField.text]
.
Use nameField.text
instead.
You could loop through the every character in the string and check that it's alphanumeric:
BOOL isMatch = YES;
for (int i = 0; i < [string length]; i++) {
unichar c = [string characterAtIndex:i];
if (!isalnum(c) && c != '_') {
isMatch = NO;
break;
}
}
if (isMatch) {
// valid
} else {
// invalid
}
Some more easy way,
NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"_"];
[allowedSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
NSCharacterSet *forbiddenSet = [allowedSet invertedSet];
It'll combine alphanumeric along with _underscore.
you can use it like,
NSRange r = [string rangeOfCharacterFromSet:forbiddenSet];
if (r.location != NSNotFound) {
NSLog(@"the string contains illegal characters");
}
PS. example copied from @DaveDeLong example :)
Here's how you can do it in Swift (as an extension of the String class):
extension String {
func containsValidCharacters() -> Bool {
var charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_")
charSet = charSet.invertedSet
let range = (self as NSString).rangeOfCharacterFromSet(charSet)
if range.location != NSNotFound {
return false
}
return true
}
}
Create your own character set using [NSCharacterSet characterSetWithCharactersInString:]
, then trim as you were doing to see if the returned string has a length value.
Or you could use invertedSet
to remove all non-set characters, if that would help to produce a cleaned string.