Регулярные выражения java

регулярные выражения

В продолжение статьи Строки в Java: String, StringBuilder, StringBuffer поговорим сегодня о регулярных выражениях:

  • что это такое и для чего нужны регулярные выражения
  • как с ними работать
  • полезные примеры.

Регулярные выражения — это инструмент который задает шаблон для строк. Если у программиста стоит задача обработать большой набор строк и отыскать в нем нужную или проверить соответствует ли входящая строка определенному правилу — регулярные выражения появляются очень к стати.

Регулярные выражения в Java

В Java есть пакет java.util.regex, который позволяет работать с регулярными выражениями. В нем есть интерфейс MatchResult — результат операции сравнения,  классы Matcher — механизм, который выполняет операции сопоставления последовательности символов путем интерпретации шаблона и Pattern — скомпилированное представление регулярного выражения.

У класса Pattern есть метод compile(), который возвращает Pattern, соответствующий регулярному выражению. Метод matches — сравнивает выражение с набором символов и возвращает true, false в зависимости от того совпали строки или нет.

Например проверка пароля, которую мы делали через метод equals может быть реализована более элегантно с помощью метода matches.

import java.util.regex.Pattern;

public class RegexExample {

	public static void isPasswordOK(String password) {
		if(Pattern.matches("admin", password)) {
			System.out.println("Hi admin");
		}
	}

	public static void main(String[] args) {
		isPasswordOK("admin");
	}

}

А как насчет проверить состоит ли строка только с цифр? С помощью вышеупомянутого метода сделать это легко.

import java.util.regex.Pattern;

public class RegexExample {

	public static void ifNumber(String string) {
		if(Pattern.matches("[0-9]+", string)) {
			System.out.println("Is number");
		}else {
			System.out.println("not a number");
		}
	}

	public static void main(String[] args) {
		ifNumber("admin");
		ifNumber("123");
	}

}

Результат выполнения кода узнаете, когда скопируете и запустите программу у себя.

Метод matches также есть и у класса String. Программа выше будет работать корректно если заменить строку Pattern.matches(«[0-9]+», string) на string.matches(«[0-9]+»). Попробуйте поэкспериментировать.

[0-9]+ и есть регулярное выражение. Оно означает, что принимаются только символы от 0 до 9, а знак + означает, что их может быть один или несколько.

Правила написания регулярных выражений

Примеры выше показали как мощны и удобны regex-пы. Для того, чтобы писать любые условия соответствия строки нужно знать правила их написания.

Их не много и они очень просты и интуитивно понятны.

  1. . — точка это соответствие любому символу
  2. ^строка — находит регулярное выражение, которое должно совпадать в начале строки
  3. строка$ — выражение, которое должно совпадать в конце строки
  4. [абв] — только буквы а или б или в
  5.  [абв][яю] — только буквы а или б или в за которыми следуют я или ю
  6. [^abc] — когда символ каретки появляется в качестве первого символа в квадратных скобках, он отрицает шаблон. Этот шаблон соответствует любому символу, кроме a или b или c.

Следующие метасимволы имеют предопределенное значение и упрощают использование некоторых общих шаблонов.

  1. \d — любая цифра — равнозначно [0-9]
  2. \D — только не цифра — равнозначно [^0-9]
  3. \s — символ пробела
  4. \w — символ слова — равнозначно [a-zA-Z_0-9]

Теперь, когда мы знаем как указать определенный набор элементов — нам нужно знать как указать частоту появления того или другого элемента.

  1. * — символ звездочки означает от ноля до бесконечности
  2. + — символ может встречаться от одного или несколько раз, сокращенно {1,}
  3. ?  — встречается ни разу или один раз, знак вопроса это сокращение для {0,1}
  4. {X} — символ встречается X раз
  5. {X,Y} — символ встречается от X до Y раз.

Теперь очередь примеров.

примеры

public class RegexExample {

	public static boolean stringHasNumbersLettersAndMinValIs5(String str) {
		
	}

	public static void main(String[] args) {
		String testString = "password";
		System.out.println(testString.matches("[a-z]{8}"));//true
		System.out.println(testString.matches("[a-z]*"));//true
		System.out.println("1".matches("\\d"));//true
		System.out.println("11".matches("[1-5]+"));//true
		System.out.println("12".matches("[1-5]+"));//true
		System.out.println("66".matches("[1-5]+"));//false
		System.out.println("lettersAndNumbers".matches("[A-Za-z0-9_.-]*"));//true
		System.out.println("lettersAndNumbers with space".matches("[A-Za-z0-9_.-]*"));//false
	}

}

Использование регулярных выражений

Regex можно использовать не только с методом matches. Некоторые методы класса String принимают регулярные выражения как параметр.

public class RegexExample {

	public static boolean stringHasNumbersLettersAndMinValIs5(String str) {
		
	}

	public static void main(String[] args) {
		String testString = "Lorem ipSum dolor sIr ameT";
		String replaced = testString.replaceAll("[A-Z]", "hi");//заменяет все заглавные буквы на hi
		System.out.println(replaced);args //hiorem iphium dolor shir amehi

	}

}

Регулярные выражения очень часто используют при валидации вводимых полей пользователями. Например, вы хотите, чтобы пароль пользователей был не меньше, чем 8 символов и мог содержать как буквы, так и цифры.

public class RegexExample {

	public static boolean passwordValidator(String password) {
		return password.matches("[0-9a-zA-Z]{8,}");
	}

	public static void main(String[] args) {
		System.out.println(passwordValidator("123Password"));//true
		System.out.println(passwordValidator("admin12"));//false - not enouth length
	}

}

Это все, что касается регулярных выражений в языке программирования java. По крайней мере, больше я не использую в своей практике. Для программирования, а тем более для новичков этого будет вполне достаточно.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *