【问题标题】:NSString value validation in iOSiOS中的NSString值验证
【发布时间】:2023-04-03 07:44:01
【问题描述】:

NSString 这种简单的验证方法很麻烦。 我有一个NSString 值,我想验证字符串,即,如果字符串包含 仅 'a 到 z'(或)'A 到 Z'(或)'1 到 9'(或)' @,!,&' 则字符串有效。如果字符串包含任何其他值,那么 NSString 无效,我该如何验证这个..?

例如:

有效:

NSString *str="aHrt@2"; // something like this 

无效:

NSString *str="..gS$"; // Like this

【问题讨论】:

  • 请注意,当前接受的答案允许的字符比预期的要多得多,包括重音字母和其他字母表中的字母。

标签: iphone ios objective-c nsstring


【解决方案1】:

尝试使用字符集:

NSMutableCharacterSet *set = [NSMutableCharacterSet characterSetWithCharactersInString:@"@!&"];
[set formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
if ([string rangeOfCharacterFromSet:[set invertedSet]].location == NSNotFound) {
    // contains a-z, A-Z, 0-9 and &@! only - valid
} else {
    // invalid
}

【讨论】:

  • 仅供参考 - alphanumericCharacterSet 包括的不仅仅是 a-z、A-Z、0-9。来自文档:非正式地说,这个集合是用作字母、音节、表意文字和数字的基本单位的所有字符的集合。
【解决方案2】:

我会使用stringByTrimmingCharactersInSet 做某事

创建一个包含所有有效字符的NSCharacterSet,然后从测试字符串中删除这些字符,如果字符串现在为空则有效,如果还有剩余字符则无效

NSCharacterSet *validCharacters = [NSCharacterSet characterSetWithCharactersInString:@"myvalidchars"];
NSString *trimmedString = [testString stringByTrimmingCharactersInSet:validCharachters];
BOOL valid = [trimmedString length] == 0;

编辑: 如果要控制可以输入到文本字段中的字符,请在UITextFieldDelegate 中使用textField:shouldChangeCharactersInRange:replacementString:

这里 testString 变量成为建议的字符串,如果没有无效字符,则返回 YES

【讨论】:

  • 我从 UITextfield 获取输入,用户只允许输入像这样的字符 'a 到 z'(或)'A 到 Z'(或)'1 到 9'(或)' @,!,&'。我用过正则表达式,但没有结果...任何示例代码朋友...?
【解决方案3】:

NSPredicate 类是你想要的

More info 关于谓词编程。基本上你想要“自我匹配”(你的正则表达式)。之后就可以使用evaluateWithObject: 方法了。

编辑更简单的方法:(没关系,因为我正在编辑它,所以沃特森发布了我要写的内容)

【讨论】:

    【解决方案4】:
    【解决方案5】:

    您也可以使用 NSRegularExpression 搜索您的 NSString,如果它只包含有效字符(反之亦然)。

    更多信息:

    Search through NSString using Regular Expression

    Use regular expression to find/replace substring in NSString

    【讨论】:

      【解决方案6】:
      - (BOOL)validation:(NSString *)string  
      {
      
         NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:@"1234567890abcdefghik"] invertedSet];
      NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
      return ([string isEqualToString:filtered]);
      }
      

      在您的按钮操作中:

      -(IBAction)ButtonPress{
      
       if ([self validation:activity.text]) {
          NSLog(@"Macth here");
      }
      else {
          NSLog(@"Not Match here");
      }
      }
      

      用你想要匹配的字母替换这个“1234567890abcdefghik”

      【讨论】:

      • 他必须替换 a-z、A-Z、0-9 和总共 80 个字符......建议一些更简单的方法。 :)
      • 我没有匹配任何内容...用户可以提供任何输入,但他只能输入诸如“a to z”(或)“A to Z”(或)“1 to 9”之类的字符(或)'@,!,&'
      • 所以你希望用户只在文本字段中输入上面列出的字符
      【解决方案7】:
      +(BOOL) validateString: (NSString *) string
      {
          NSString *regex = @"[A-Z0-9a-z@!&]";
          NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",  emailRegex];
          BOOL isValid = [test evaluateWithObject:string];
          return isValid;
      }
      

      【讨论】:

        【解决方案8】:

        您可以使用 NSMutableCharacterSet 简单地做到这一点

        NSMutableCharacterSet *charactersToKeep = [NSMutableCharacterSet alphanumericCharacterSet];
        [charactersToKeep addCharactersInString:@"@?!"];
        NSCharacterSet *charactersToRemove = [charactersToKeep invertedSet]
        NSString *trimmed = [ str componentsSeparatedByCharactersInSet:charactersToRemove];
        if([trimmed length] != 0)
        {
          //invalid string
        }
        

        参考NSCharacterSet

        【讨论】:

        • 这基本上是 H2CO3 答案的重复(也有同样的问题)。
        【解决方案9】:

        您可以使用正则表达式。如果每件事都失败了,请使用蛮力,例如

         unichar c[yourString.length];
                 NSRange raneg={0,2};
                [yourString getCharacters:c range:raneg];
        
        // now in for loop
        
            for(int i=0;i<yourString.length;i++)
            {
             if((c[i]>='A'&&c[i]<='Z')&&(c[i]=='@'||c[i]=='!'||c[i]=='&'))
               {
                 //not the best or most efficient way but will work till you write your regex:P
               }
        
        
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-16
          • 1970-01-01
          相关资源
          最近更新 更多