检查NSString是否仅包含字母数字+下划线字符

Dav*_*vid 54 objective-c ios

我有一个字符串,只需要az,0-9和_

如何检查输入是否有效?我试过这个,但它接受像å,ä,ö,ø等字母.

NSString *string = [NSString stringWithString:nameField.text];
NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet];
[string stringByTrimmingCharactersInSet:alphaSet];
[string stringByReplacingOccurrencesOfString:@"_" withString:@""];
BOOL valid = [[string stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""];
Run Code Online (Sandbox Code Playgroud)

Dav*_*ong 129

您可以创建自己的字符集:

NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"];
Run Code Online (Sandbox Code Playgroud)

完成后,将其反转为原始字符串中不包含的所有内容:

s = [s invertedSet];
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用字符串方法来查找您的字符串是否包含反转集中的任何内容:

NSRange r = [string rangeOfCharacterFromSet:s];
if (r.location != NSNotFound) {
  NSLog(@"the string contains illegal characters");
}
Run Code Online (Sandbox Code Playgroud)


Sin*_*ris 36

您可以使用谓词:

NSString *myRegex = @"[A-Z0-9a-z_]*"; 
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", myRegex]; 
NSString *string = nameField.text;
BOOL valid = [myTest evaluateWithObject:string];
Run Code Online (Sandbox Code Playgroud)

编辑: 我没注意到你在使用[NSString stringWithString:nameField.text].

nameField.text改用.


Hem*_*ang 9

一些更简单的方法,

NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"_"];
[allowedSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
NSCharacterSet *forbiddenSet = [allowedSet invertedSet];
Run Code Online (Sandbox Code Playgroud)

它会将字母数字与_underscore结合起来.

你可以像使用它一样

NSRange r = [string rangeOfCharacterFromSet:forbiddenSet];
if (r.location != NSNotFound) {
  NSLog(@"the string contains illegal characters");
}
Run Code Online (Sandbox Code Playgroud)

PS.从@DaveDeLong示例复制的示例:)

  • 这个答案很甜蜜,现在我患有糖尿病. (2认同)