【问题标题】:Check NSString for special characters检查 NSString 是否有特殊字符
【发布时间】:2010-02-19 14:48:06
【问题描述】:

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

我不需要检查存在多少特殊字符或它们的位置,我只需要知道特定字符串是否包含任何特殊字符。如果是这样,那么我希望能够显示“错误!”,或类似的东西。

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

此外,不应允许使用带有重音符号、变音符号等的字母。

我该怎么做?

谢谢!

迈克尔

【问题讨论】:

    标签: cocoa nsstring special-characters


    【解决方案1】:
    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");
    }
    

    【讨论】:

    • 这不应该影响逻辑,但仅供参考,字符集中有两个“K”。
    • @Dave DeLong 在你的情况下,你不能处理像 ""m³","m²","ft²","ft³","°C","°F", “°K”等”
    • 使用这个 NSCharacterSet *s = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"] reverseSet];
    • 该死的,我投了反对票,而不是投了赞成票,现在我无法改变它。这个很好的解决方案!
    • @rustyMagnet 因为+alphanumericCharacterSet 5 年前出现了,但这个答案是 10 年前的...... ;) 我已经更新了答案。
    【解决方案2】:

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

    NSString *string = <your string>;
    
    NSString *specialCharacterString = @"!~`@#$%^&*-+();:={}[],.<>?\\/\"\'";
    NSCharacterSet *specialCharacterSet = [NSCharacterSet
                                           characterSetWithCharactersInString:specialCharacterString];
    
    if ([string.lowercaseString rangeOfCharacterFromSet:specialCharacterSet].length) {                
        NSLog(@"contains special characters");
    }
    

    【讨论】:

      【解决方案3】:

      如果在字符串中找不到任何字符,您想使用字符集搜索 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;
        }
        

        【讨论】:

        • 而不是“return (![string isEqualToString:filtered]) ? NO : YES;”,为什么不只是“return [string isEqualToString:filtered];”?
        【解决方案5】:

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

        - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
        
            if ([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
                return NO;
            else
                return YES;
        
        }
        

        【讨论】:

        • 但是这个问题也清楚地询问了字母。
        猜你喜欢
        • 2015-11-04
        • 2020-03-15
        • 2010-12-20
        • 2011-11-26
        • 2016-08-24
        • 2011-08-08
        • 2022-08-11
        • 1970-01-01
        • 2016-08-01
        相关资源
        最近更新 更多