Поиск по сайту:

Регулярное выражение в Java — пример Java Regex


Добро пожаловать в регулярные выражения в Java. Это также называется Regex в Java. Когда я начал программировать, регулярные выражения Java были для меня кошмаром. Этот учебник призван помочь вам освоить регулярное выражение в Java. Я также вернусь сюда, чтобы обновить свои знания Java Regex.

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

  1. Шаблон: объект Шаблон представляет собой скомпилированную версию регулярного выражения. Класс шаблона не имеет общедоступного конструктора, и мы используем его общедоступный статический метод compile для создания объекта шаблона путем передачи аргумента регулярного выражения.
  2. Matcher: Matcher – это объект механизма регулярных выражений Java, который сопоставляет входной шаблон String с созданным объектом шаблона. Класс Matcher не имеет общедоступного конструктора, и мы получаем объект Matcher, используя метод объекта шаблона matcher, который принимает входную строку в качестве аргумента. Затем мы используем метод matches, который возвращает логический результат на основе входной строки, соответствует шаблону регулярного выражения или нет.
  3. PatternSyntaxException: PatternSyntaxException создается, если синтаксис регулярного выражения неверен.

Давайте посмотрим на пример программы Java Regex.

package com.journaldev.util;

import java.util.regex.*;

public class PatternExample {

	public static void main(String[] args) {
		Pattern pattern = Pattern.compile(".xx.");
		Matcher matcher = pattern.matcher("MxxY");
		System.out.println("Input String matches regex - "+matcher.matches());
		// bad regular expression
		pattern = Pattern.compile("*xx*");

	}

}

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

Input String matches regex - true
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*xx*
^
	at java.util.regex.Pattern.error(Pattern.java:1924)
	at java.util.regex.Pattern.sequence(Pattern.java:2090)
	at java.util.regex.Pattern.expr(Pattern.java:1964)
	at java.util.regex.Pattern.compile(Pattern.java:1665)
	at java.util.regex.Pattern.(Pattern.java:1337)
	at java.util.regex.Pattern.compile(Pattern.java:1022)
	at com.journaldev.util.PatternExample.main(PatternExample.java:13)

Поскольку регулярное выражение Java вращается вокруг String, класс String был расширен в Java 1.4, чтобы предоставить метод matches , который выполняет сопоставление шаблонов регулярных выражений. Внутри он использует классы регулярных выражений Java Pattern и Matcher для выполнения обработки, но, очевидно, это сокращает количество строк кода. Класс Pattern также содержит метод matches, который принимает регулярное выражение и входную строку в качестве аргумента и возвращает логический результат после их сопоставления. Таким образом, приведенный ниже код отлично работает для сопоставления входной строки с регулярным выражением в Java.

String str = "bbb";
System.out.println("Using String matches method: "+str.matches(".bb"));
System.out.println("Using Pattern matches method: "+Pattern.matches(".bb", str));

Поэтому, если вам нужно просто проверить, соответствует ли входная строка шаблону, вы должны сэкономить время и строки кода, используя простой метод сопоставления строк. Вы должны использовать классы Pattern и Matches только тогда, когда вам нужно манипулировать входной строкой или вам нужно повторно использовать шаблон. Обратите внимание, что шаблон, определенный регулярным выражением, применяется к строке слева направо, и после того, как исходный символ используется в совпадении, его нельзя использовать повторно. Например, регулярное выражение \121 будет соответствовать \31212142121 только дважды, чем \_121____121.

Регулярное выражение в Java — общие совпадающие символы

Regular Expression Description Example
. Matches any single character (“…”, “a%”) – true(“…”, “.a”) – true (“…”, “a”) – false
^aaa Matches aaa regex at the beginning of the line (“^a.c.”, “abcd”) – true (“^a”, “ac”) – false
aaa$ Matches regex aaa at the end of the line (“…cd$”, “abcd”) – true(“a$”, “a”) – true (“a$”, “aca”) – false
[abc] Can match any of the letter a, b or c. [] are known as character classes. (“^[abc]d.”, “ad9”) – true(“[ab].d$”, “bad”) – true (“[ab]x”, “cx”) – false
[abc][12] Can match a, b or c followed by 1 or 2 (“[ab][12].”, “a2#”) – true(“[ab]…[12]”, “acd2”) – true (“[ab][12]”, “c2”) – false
[^abc] When ^ is the first character in [], it negates the pattern, matches anything except a, b or c (“[^ab][^12].”, “c3#”) – true(“[^ab]…[^12]”, “xcd3”) – true (“[^ab][^12]”, “c2”) – false
[a-e1-8] Matches ranges between a to e or 1 to 8 (“[a-e1-3].”, “d#”) – true(“[a-e1-3]”, “2”) – true (“[a-e1-3]”, “f2”) – false
xx yy Matches regex xx or yy

Метасимволы регулярных выражений Java

У нас есть некоторые метасимволы в регулярном выражении Java, это как шорткоды для общих шаблонов сопоставления.

Regular Expression Description
\d Any digits, short of [0-9]
\D Any non-digit, short for [^0-9]
\s Any whitespace character, short for [\t\n\x0B\f\r]
\S Any non-whitespace character, short for [^\s]
\w Any word character, short for [a-zA-Z_0-9]
\W Any non-word character, short for [^\w]
\b A word boundary
\B A non word boundary

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

  1. Поставьте перед метасимволом обратную косую черту (\).
  2. Сохраняйте метасимволы внутри \Q (с которого начинается кавычка) и \E (с которого она заканчивается).

Регулярные выражения в Java — квантификаторы

Квантификаторы регулярных выражений Java определяют количество вхождений символа для сопоставления.

Regular Expression Description
x? x occurs once or not at all
X* X occurs zero or more times
X+ X occurs one or more times
X{n} X occurs exactly n times
X{n,} X occurs n or more times
X{n,m} X occurs at least n times but not more than m times

Java Regex Quantifiers также можно использовать с классами символов и группами захвата. Например, [abc]+ означает - a, b или c - один или несколько раз. (abc)+ означает группу \abc еще раз. Теперь мы обсудим группу захвата.

Регулярные выражения в Java — захват групп

Регулярное выражение в группах Java Capturing используется для обработки нескольких символов как единого блока. Вы можете создать группу, используя (). Часть входной строки, которая соответствует группе захвата, сохраняется в памяти и может быть вызвана с помощью обратной ссылки. Вы можете использовать метод matcher.groupCount, чтобы узнать количество групп захвата в шаблоне регулярного выражения Java. Например, ((a)(bc)) содержит 3 группы захвата: ((a)(bc)), (a) и (bc) . Вы можете использовать обратную ссылку в регулярном выражении с обратной косой чертой (\), а затем с номером группы, которую нужно отозвать. Захват групп и обратных ссылок может сбивать с толку, поэтому давайте разберемся с этим на примере.

System.out.println(Pattern.matches("(\\w\\d)\\1", "a2a2")); //true
System.out.println(Pattern.matches("(\\w\\d)\\1", "a2b2")); //false
System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B2AB")); //true
System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B3AB")); //false

В первом примере первой группой захвата во время выполнения является (\w\d), которая оценивается как \a2 при сопоставлении с входной строкой \a2a2 и сохраняется в памяти. Итак, \1 ссылается на \a2 и, следовательно, возвращает true. По той же причине второй оператор печатает false. Попробуйте сами понять этот сценарий для операторов 3 и 4. :) Теперь мы рассмотрим некоторые важные методы Классы Pattern и Matcher.

  1. Мы можем создать объект Pattern с флагами. Например, Pattern.CASE_INSENSITIVE включает сопоставление без учета регистра.
  2. Класс Pattern также предоставляет метод split(String), аналогичный методу split() класса String.
  3. Метод toString() класса шаблона возвращает регулярное выражение String, из которого был скомпилирован этот шаблон.
  4. В классах Matcher есть индексные методы start() и end(), которые точно показывают, где во входной строке было найдено совпадение.
  5. Класс Matcher также предоставляет методы обработки строк replaceAll(замена строки) и replaceFirst(замена строки).

Давайте рассмотрим эти методы регулярных выражений Java в простой примерной программе.

package com.journaldev.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExamples {

	public static void main(String[] args) {
		// using pattern with flags
		Pattern pattern = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher("ABcabdAb");
		// using Matcher find(), group(), start() and end() methods
		while (matcher.find()) {
			System.out.println("Found the text \"" + matcher.group()
					+ "\" starting at " + matcher.start()
					+ " index and ending at index " + matcher.end());
		}

		// using Pattern split() method
		pattern = Pattern.compile("\\W");
		String[] words = pattern.split("one@two#three:four$five");
		for (String s : words) {
			System.out.println("Split using Pattern.split(): " + s);
		}

		// using Matcher.replaceFirst() and replaceAll() methods
		pattern = Pattern.compile("1*2");
		matcher = pattern.matcher("11234512678");
		System.out.println("Using replaceAll: " + matcher.replaceAll("_"));
		System.out.println("Using replaceFirst: " + matcher.replaceFirst("_"));
	}

}

Вывод приведенного выше примера программы регулярных выражений Java:

Found the text "AB" starting at 0 index and ending at index 2
Found the text "ab" starting at 3 index and ending at index 5
Found the text "Ab" starting at 6 index and ending at index 8
Split using Pattern.split(): one
Split using Pattern.split(): two
Split using Pattern.split(): three
Split using Pattern.split(): four
Split using Pattern.split(): five
Using replaceAll: _345_678
Using replaceFirst: _34512678

Это все, что касается регулярных выражений в Java. Поначалу Java Regex кажется сложным, но если вы поработаете с ним какое-то время, его легко освоить и использовать.

Вы можете получить полный код и другие примеры регулярных выражений в нашем репозитории GitHub.