Современное 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.