2016-06-21 4 views
0

Работа с Swift-приложением, и у меня есть заполненная пользователем форма, и я бы хотел, чтобы пользователь выбрал свое имя пользователя. Единственные ограничения, которые я хочу на имя пользователя являются:Swift: Validate Username Input

  • Никаких специальных символов (например, @, #, $,%, &, *, (,), ^, <,>, ±!)
  • только буквы, символы подчеркивания и цифры позволили
  • Длина должна быть не менее 18 символов максимум и 7 символов минимум

Где я могу найти функцию, которая проверяет входную строку (параметр функции) и return true или false, основанный на вышеуказанных критериях? Я не очень хорошо разбираюсь в регулярных выражениях.

+1

Вам следует опубликовать то, что вы пробовали. – Code

ответ

8

Использование NSPredicate с MATCHES и последующее регулярное выражение:

^\w{7,18}$ 

Смотрите regex demo

Шаблон совпадений:

  • ^ - начало строки (можно заменить с \A t o обеспечить начало строки только совпадениями)
  • \w{7,18} - от 7 до 18 словных символов (т. буквы, цифры или символы подчёркивания)
  • $ - конец строки (для проверки я предпочел бы вместо этого использовать \z, чтобы гарантировать соответствие концов строки).

Swift код:

func isValidInput(Input:String) -> Bool { 
    let RegEx = "\\A\\w{7,18}\\z" 
    let Test = NSPredicate(format:"SELF MATCHES %@", RegEx) 
    return Test.evaluateWithObject(Input) 
} 
+1

Спасибо за вашу поддержку ... Объяснение действительно полезно ... позволяет мне изменять для будущих сценариев –

+0

, почему необходимо указать начало строки и конца строки? – andrei

+0

@andrei Вам не нужно использовать '\ A' и' \ z', если вы используете регулярное выражение с 'MATCHES' в' NSPredicate', поскольку он по умолчанию привязывает шаблон regex. Тем не менее, это хорошая идея, чтобы сохранить якоря в шаблоне в случае, если вы хотите протестировать его в любых онлайн-тестировщиках регулярных выражений, или просто чтобы лучше понять, что делает регулярное выражение. Кроме того, если вы используете его в других методах, которые по умолчанию не привязывают шаблон, его поведение не изменится. –

3
func validateUsername(str: String) -> Bool 
{ 
    do 
    { 
     let regex = try NSRegularExpression(pattern: "^[0-9a-zA-Z\\_]{7,18}$", options: .CaseInsensitive) 
     if regex.matchesInString(str, options: [], range: NSMakeRange(0, str.characters.count)).count > 0 {return true} 
    } 
    catch {} 
    return false 
} 
+0

Нашли, это проще редактировать и использовать для проверки имени тоже. Спасибо mate –

+0

@ksa_coder приветствуется –

0
func isValidUsername(testStr:String) -> Bool { 

     var rawString: String = testStr 
     var whitespace: NSCharacterSet = NSCharacterSet.whitespaceAndNewlineCharacterSet() 
     trimmed = rawString.stringByTrimmingCharactersInSet(whitespace) 

     if trimmed.characters.count>0 
     { 

      return true 
     } 
     else 
     { 

      return false 
     } 

    }