检查NSString中是否包含特殊字符。

34

我想检查一个NSString中是否含有特殊字符,即除了a-z、A-Z和0-9之外的任何字符。

我不需要检查字符串中有多少特殊字符或它们的位置,只需知道特定字符串是否包含这些字符。如果包含,则希望能够显示"错误!"或类似的内容。

例如,jHfd9982是可以的,但asdJh992@则不行。

此外,带重音符号、变音符号等的字母也不允许出现。

我该如何处理呢?

谢谢!

迈克尔

5个回答

113
NSCharacterSet * set = [[NSCharacterSet alphanumericCharacterSet] invertedSet];

if ([aString rangeOfCharacterFromSet:set].location != NSNotFound) {
  NSLog(@"This string contains illegal characters");
}

你也可以使用正则表达式(这个语法来自于RegexKitLite:http://regexkit.sourceforge.net):

if ([aString isMatchedByRegex:@"[^a-zA-Z0-9]"]) {
  NSLog(@"This string contains illegal characters");
}

5
这不应该影响逻辑,但是顺便提一下,字符集中有两个“K”。 - user1021430
@Dave DeLong 在你的情况下,你不能处理像“m³”、“m²”、“ft²”、“ft³”、“°C”、“°F”、“°K”等这样的Unicode。 - LiangWang
使用以下代码创建字符集:NSCharacterSet *s = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"] invertedSet]; - kb920
1
该死,我点了踩而不是赞,现在我无法更改。这是个好解决方案! - coolcool1994
1
@rustyMagnet 因为+alphanumericCharacterSet是在5年前出现的,但这个答案是10年前的... ;) 我已经更新了答案。 - Dave DeLong
显示剩余2条评论

10

这里是代码,您可以使用它来检查字符串是否有任何特殊字符

NSString *string = <your string>;

NSString *specialCharacterString = @"!~`@#$%^&*-+();:={}[],.<>?\\/\"\'";
NSCharacterSet *specialCharacterSet = [NSCharacterSet
                                       characterSetWithCharactersInString:specialCharacterString];

if ([string.lowercaseString rangeOfCharacterFromSet:specialCharacterSet].length) {                
    NSLog(@"contains special characters");
}

6

如果在NSString中找不到任何字符,您希望使用字符集进行搜索,则rangeOfCharacterFromSet:将返回{NSNotFound,0}的范围。

字符集可以是[NSCharacterSet symbolCharacterSet]或您自己的字符集。请注意,您还可以反转字符集,因此您可以拥有一组可接受的字符。


4

如果您想在编辑时从任何字符串(甚至文本字段文本)中删除特殊字符和数字,以下代码非常有用:

#define ACCEPTABLE_CHARACTERS @"!~`@#$%^&*-+();:=_{}[],.<>?\\/|\"\'0123456789"

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS];

    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

    return (![string isEqualToString:filtered]) ? NO : YES;
}

1
为什么不直接使用"return [string isEqualToString:filtered];",而不是"return (![string isEqualToString:filtered]) ? NO : YES;"? - Paulius Vindzigelskis

2

该代码只允许在UITextField输入数字。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    if ([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
        return NO;
    else
        return YES;

}

但问题明确要求包括字母。 - superarts.org

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接