Валидация – неотъемлемая часть любого интерактивного web-приложения. Зачем валидировать имя пользователя? Причин может быть множество. Хотя бы для того, чтобы не сохранить в базу данных вредоносный код, например, JavaScript-код. В будущем, имя пользователя может использоваться в составе email, в котором не допускается определеный набор символов и определенная длина.
Ниже мы рассмотрим регулярное выражение, с помощью которого можно выполнить проверку правильности введенного пользователем имени.
Unit-тест написан с использованием библиотеки TestNG 5.10. Как запустить тесты TestNG в Eclipse читайте здесь.
Выражение:
^[a-z0-9_-]{3,15}$
Комментарий:
^ # Начало строки [a-z0-9_-] # Совпадения с буквами и символами a-z, 0-9, подчеркивание, тире {3,15} # Длина от трех до пятнадцати символов $ # Конец строки
Пример на Java:
package ru.topcode.skillbase.regexp; import java.util.regex.Matcher; import java.util.regex.Pattern; public class UsernameValidator { private Pattern pattern; private Matcher matcher; private static final String USERNAME_PATTERN = "^[a-z0-9_-]{3,15}$"; public UsernameValidator() { pattern = Pattern.compile(USERNAME_PATTERN); } /** * Проверка имени пользователя с помощью регулярного выражения * * @param username * имя пользователя * @return true если имя валидное, false - не валидное */ public boolean validate(final String username) { matcher = pattern.matcher(username); return matcher.matches(); } }
Unit Test:
package ru.topcode.skillbase.regexp.test; import ru.topcode.skillbase.regexp.UsernameValidator; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class UsernameValidatorTest { private UsernameValidator usernameValidator; @BeforeClass public void initData() { usernameValidator = new UsernameValidator(); } @DataProvider public Object[][] ValidUsernameProvider() { return new Object[][] { { new String[] { "leontyev34", "leontyev_2002", "leontyev-2002", "le3-4_ontyev" } } }; } @DataProvider public Object[][] InvalidUsernameProvider() { return new Object[][] { { new String[] { "le", "le@dmitriy", "leontyev123456789_-" } } }; } @Test(dataProvider = "ValidUsernameProvider") public void ValidUsernameTest(String[] Username) { for (String temp : Username) { boolean valid = usernameValidator.validate(temp); System.out.println("Валидность имени : " + temp + " , " + valid); Assert.assertEquals(true, valid); } } @Test(dataProvider = "InvalidUsernameProvider", dependsOnMethods = "ValidUsernameTest") public void InValidUsernameTest(String[] Username) { for (String temp : Username) { boolean valid = usernameValidator.validate(temp); System.out.println("Валидность имени : " + temp + " , " + valid); Assert.assertEquals(false, valid); } } }
Результат выполнения теста:
Валидность имени : leontyev34 , true Валидность имени : leontyev_2002 , true Валидность имени : leontyev-2002 , true Валидность имени : le3-4_ontyev , true Валидность имени : le , false Валидность имени : le@dmitriy , false Валидность имени : leontyev123456789_- , false PASSED: ValidUsernameTest([Ljava.lang.String;@d6a05e) PASSED: InValidUsernameTest([Ljava.lang.String;@ff057f) =============================================== ru.topcode.skillbase.regexp.test.UsernameValidatorTest Tests run: 2, Failures: 0, Skips: 0 ===============================================
Для углубленного изучения регулярных выражений в Java рекомендую посетить соответствующий раздел The Java Tutorials и изучить книги из раздела RegExp в библиотеке TopCode.


#1 by eldest on 27 Ноябрь 2009 - 12:22
Quote
А верхний регистр специально не учитывается?
Если нет то: USERNAME_PATTERN(“^[a-zA-Z0-9_-]{3,15}$”);
Ну и: {3,15} # Длина от трех до пяти(15?) символов
#2 by Дмитрий Леонтьев on 27 Ноябрь 2009 - 12:25
Quote
В данном примере регистр не учитывается специально, но если нужны символы из верхнего регистра, то да – нужно сделать как написали вы.
> {3,15} # Длина от трех до пяти(15?) символов
Поправил. Спасибо.
#3 by handsOff MySis on 15 Октябрь 2010 - 4:12
Quote
я пробывал эти шаблоны для f:validateRegex вставлял их в атрибут pattern. ничего так и не заработало ( расскажите плиз про f:validateRegex
#4 by Дмитрий Леонтьев on 7 Ноябрь 2010 - 20:13
Quote
Здравствуйте, handsOff MySis!
Вот пример работы f:validateRegex именно с этим регулярным выражением:
Бин:
XHTML:
Для проверки вводим, например, русский текст в поле, жмем “Проверить” и получаем сообщение Regex Pattern not matched.
#5 by 1111!!! on 24 Февраль 2012 - 17:45
Quote
ыуувы