Современное web-приложение невозможно представить без мультимедийных возможностей. Наиболее распространенный тип файлов, которым пользователи манипулируют в Интернете – это изображения. Социальные сети позволяют загружать свои фотографии, блоги – позволяют вставлять рисунки в посты и т.д. Чтобы соответствующим образом обработать изображение, нужно сперва узнать его расширение и определить, является ли загруженный пользователем файл изображением.
Ниже я предлагаю решение этой задачи с помощью регулярного выражения.
Unit-тест написан с использованием библиотеки TestNG 5.10. Как запустить тесты TestNG в Eclipse читайте здесь.
Выражение:
([^\s]+(\.(?i)(jpg|png|gif|bmp))$)
Комментарий:
( # Начало первой группы [^\s]+ # должно содержать один или более символов, исключая пробелы ( # Начало второй группы \. # за которыми следует "." (?i) # игнорировать регистр символов для следующих символов ( # начало третьей группы jpg # содержит последовательность символов "jpg" | # или png # содержит последовательность символов "png" | # или gif # содержит последовательность символов "gif" | # или bmp # содержит последовательность символов "bmp" ) # конец третьей группы ) # конец второй группы $ # конец строки ) # конец первой группы
Пример на Java:
package ru.topcode.skillbase.regexp; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ImageValidator { private Pattern pattern; private Matcher matcher; private static final String IMAGE_PATTERN = "([^\\s]+(\\.(?i)(jpg|png|gif|bmp))$)"; public ImageValidator() { pattern = Pattern.compile(IMAGE_PATTERN); } /** * Валидация имени изображения с помощью регулярного выражения * * @param image * имя изображения для валидации * @return true - валидное имя, false - не валидное имя */ public boolean validate(final String image) { matcher = pattern.matcher(image); return matcher.matches(); } }
Unit Test:
package ru.topcode.skillbase.regexp.test; import org.testng.Assert; import org.testng.annotations.*; import ru.topcode.skillbase.regexp.ImageValidator; public class ImageValidatorTest { private ImageValidator imageValidator; @BeforeClass public void initData() { imageValidator = new ImageValidator(); } @DataProvider public Object[][] ValidImageProvider() { return new Object[][] { { new String[] { "a.jpg", "a.gif", "a.png", "a.bmp", "..jpg", "..gif", "..png", "..bmp", "a.JPG", "a.GIF", "a.PNG", "a.BMP", "a.JpG", "a.GiF", "a.PnG", "a.BmP", "jpg.jpg", "gif.gif", "png.png", "bmp.bmp" } } }; } @DataProvider public Object[][] InvalidImageProvider() { return new Object[][] { { new String[] { ".jpg", ".gif", ".png", ".bmp", " .jpg", " .gif", " .png", " .bmp", "a.txt", "a.exe", "a.", "a.mp3", "jpg", "gif", "png", "bmp" } } }; } @Test(dataProvider = "ValidImageProvider") public void ValidImageTest(String[] Image) { for (String temp : Image) { boolean valid = imageValidator.validate(temp); System.out.println("Валидность имени : " + temp + " , " + valid); Assert.assertEquals(true, valid); } } @Test(dataProvider = "InvalidImageProvider", dependsOnMethods = "ValidImageTest") public void InValidImageTest(String[] Image) { for (String temp : Image) { boolean valid = imageValidator.validate(temp); System.out.println("Валидность имени : " + temp + " , " + valid); Assert.assertEquals(false, valid); } } }
Результат выполнения теста:
Валидность имени : a.jpg , true Валидность имени : a.gif , true Валидность имени : a.png , true Валидность имени : a.bmp , true Валидность имени : ..jpg , true Валидность имени : ..gif , true Валидность имени : ..png , true Валидность имени : ..bmp , true Валидность имени : a.JPG , true Валидность имени : a.GIF , true Валидность имени : a.PNG , true Валидность имени : a.BMP , true Валидность имени : a.JpG , true Валидность имени : a.GiF , true Валидность имени : a.PnG , true Валидность имени : a.BmP , true Валидность имени : jpg.jpg , true Валидность имени : gif.gif , true Валидность имени : png.png , true Валидность имени : bmp.bmp , true Валидность имени : .jpg , false Валидность имени : .gif , false Валидность имени : .png , false Валидность имени : .bmp , false Валидность имени : .jpg , false Валидность имени : .gif , false Валидность имени : .png , false Валидность имени : .bmp , false Валидность имени : a.txt , false Валидность имени : a.exe , false Валидность имени : a. , false Валидность имени : a.mp3 , false Валидность имени : jpg , false Валидность имени : gif , false Валидность имени : png , false Валидность имени : bmp , false PASSED: ValidImageTest([Ljava.lang.String;@bf7190) PASSED: InValidImageTest([Ljava.lang.String;@1d332b) =============================================== ru.topcode.skillbase.regexp.test.ImageValidatorTest Tests run: 2, Failures: 0, Skips: 0 ===============================================
Для углубленного изучения регулярных выражений в Java рекомендую посетить соответствующий раздел The Java Tutorials и изучить книги из раздела RegExp в библиотеке TopCode.

