Валидация – неотъемлемая часть любого интерактивного 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.