如何验证 [objective-c] 中的用户名?

how to do validation for username in [objective-c]?

我对 validation 的要求是验证 username 允许输入小的 a-z 和 0-9,并且只有两个符号 _.(点)

但符号不重复

名称开头不允许使用符号。

谁能帮帮我??怎么做 validation?

我试过这段代码,但它工作正常,但它重复符号我怎样才能避免重复?

- (BOOL)validateString:(NSString*)stringToSearch
{
    NSString *emailRegex = @"[a-z0-9._]{5,15}";
    NSPredicate *regex = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [regex evaluateWithObject:stringToSearch];



}

使用以下正则表达式检查字符是否正确:

^([a-z0-9]+[._])*[a-z0-9]+$

Debuggex Demo

另外单独检查字符串长度。 (或使用前瞻)

编辑: 看来我看错了一些要求。上面的正则表达式也不允许在名称末尾使用符号。如果您想在那里允许符号,请将正则表达式更改为
^([a-z0-9]+[._]?)*$

如果使用谓词,则可以省略前导 ^ 和尾随 $

纯正则表达式方法,使用前瞻性计数,可能有其他简化的解决方案

"(?=[a-z0-9._]{5,15})([a-z0-9][._]?)+"

编辑

关于附加问题:如何避免用户输入被拒绝的字符

从技术上讲,您可以通过实施 UITextViewDelegate 方法 textView(_:shouldChangeTextInRange:replacementText:) 来实现。但这可能会给用户留下键盘没有正确响应的印象。

因此,通过某种显示警报的警报实施 textViewShouldEndEditing(_:) 方法可能会带来更好的用户体验。

定义验证@"abcdefghijklmnopqrstuvwxyz0123456789_."

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
     NSCharacterSet *unacceptedInput = nil;
     unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:ALPHA] invertedSet];
            
            if ([[string componentsSeparatedByCharactersInSet:unacceptedInput] count] <= 1) {
                
                int newLength = (int)textField.text.length + (int)string.length - (int)range.length;
                if (newLength > 50) {
                    return false;
                } else {
                    return true;
                }
            } else {
                return false;
            }
}

我还必须在我的项目中对文本长度不超过 50 个字符进行验证,这样您就可以删除该条件