Учебники

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

Java предоставляет пакет java.util.regex для сопоставления с шаблоном с регулярными выражениями. Регулярные выражения Java очень похожи на язык программирования Perl и очень просты в освоении.

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

Пакет java.util.regex в основном состоит из следующих трех классов:

  • Класс Pattern — Объект Pattern представляет собой скомпилированное представление регулярного выражения. Класс Pattern не предоставляет общедоступных конструкторов. Чтобы создать шаблон, вы должны сначала вызвать один из его открытых статических методов compile () , который затем вернет объект Pattern. Эти методы принимают регулярное выражение в качестве первого аргумента.

  • Класс Matcher — объект Matcher — это механизм, который интерпретирует шаблон и выполняет операции сопоставления с входной строкой. Как и класс Pattern, Matcher не определяет общедоступных конструкторов. Вы получаете объект Matcher, вызывая метод matcher () для объекта Pattern.

  • PatternSyntaxException — Объект PatternSyntaxException является непроверенным исключением, которое указывает на синтаксическую ошибку в образце регулярного выражения.

Класс Pattern — Объект Pattern представляет собой скомпилированное представление регулярного выражения. Класс Pattern не предоставляет общедоступных конструкторов. Чтобы создать шаблон, вы должны сначала вызвать один из его открытых статических методов compile () , который затем вернет объект Pattern. Эти методы принимают регулярное выражение в качестве первого аргумента.

Класс Matcher — объект Matcher — это механизм, который интерпретирует шаблон и выполняет операции сопоставления с входной строкой. Как и класс Pattern, Matcher не определяет общедоступных конструкторов. Вы получаете объект Matcher, вызывая метод matcher () для объекта Pattern.

PatternSyntaxException — Объект PatternSyntaxException является непроверенным исключением, которое указывает на синтаксическую ошибку в образце регулярного выражения.

Захват групп

Захват групп — это способ рассматривать несколько символов как единое целое. Они создаются путем помещения символов, которые будут сгруппированы, в набор скобок. Например, регулярное выражение (собака) создает одну группу, содержащую буквы «d», «o» и «g».

Захватывающие группы нумеруются путем подсчета открывающих скобок слева направо. В выражении ((A) (B (C))), например, есть четыре такие группы —

  • ((А) (В (С)))
  • (А)
  • (ДО НАШЕЙ ЭРЫ))
  • (С)

Чтобы узнать, сколько групп присутствует в выражении, вызовите метод groupCount для объекта соответствия. Метод groupCount возвращает int, показывающий количество групп захвата, присутствующих в шаблоне сопоставителя.

Существует также специальная группа, группа 0, которая всегда представляет все выражение. Эта группа не включена в общее количество, сообщенное groupCount.

пример

В следующем примере показано, как найти строку цифр из заданной буквенно-цифровой строки:

Live Demo

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

public class RegexMatches {

   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      }else {
         System.out.println("NO MATCH");
      }
   }
}

Это даст следующий результат —

Выход

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

Синтаксис регулярных выражений

Вот таблица со списком всех синтаксисов метасимволов регулярных выражений, доступных в Java:

Подвыражение Матчи
^ Соответствует началу строки.
$ Соответствует концу строки.
, Соответствует любому отдельному символу, кроме новой строки. Использование опции m позволяет ему соответствовать и новой строке.
[…] Соответствует любому отдельному символу в скобках.
[^ …] Соответствует любому отдельному символу не в скобках.
\ A Начало всей строки.
\ г Конец всей строки.
\ Z Конец всей строки, кроме допустимого конечного конца строки.
ре * Соответствует 0 или более вхождений предыдущего выражения.
ре + Соответствует 1 или более из предыдущей вещи.
повторно? Соответствует 0 или 1 вхождению предыдущего выражения.
re {n} Совпадает ровно с числом вхождений предыдущего выражения.
re {n,} Соответствует n или более вхождений предыдущего выражения.
re {n, m} Соответствует не менее n и не более m вхождений предыдущего выражения.
| б Соответствует либо a, либо b.
(Ре) Группирует регулярные выражения и запоминает сопоставленный текст.
(?: re) Группирует регулярные выражения без запоминания сопоставленного текста.
(?> re) Соответствует независимому образцу без возврата.
\ ш Соответствует слову символов.
\ W Соответствует несловесным символам.
\ s Соответствует пробелу. Эквивалентно [\ t \ n \ r \ f].
\ S Соответствует непробельному пространству.
\ d Соответствует цифрам. Эквивалентно [0-9].
\ D Совпадает с нецифрами.
\ A Соответствует началу строки.
\ Z Соответствует концу строки. Если новая строка существует, она совпадает непосредственно перед новой строкой.
\ г Соответствует концу строки.
Соответствует точке, где закончился последний матч.
\ п Обратная ссылка для захвата номера группы «n».
\ б Соответствует границам слов вне скобок. Соответствует возврату (0x08) внутри скобок.
\ B Соответствует границам без слов.
\ n, \ t и т. д. Сопоставляет переводы строк, возврат каретки, вкладки и т. Д.
\ Q Побег (цитата) всех символов до \ E.
\ E Завершает цитирование, начинающееся с \ Q.

Методы класса Matcher

Вот список полезных методов экземпляра —

Методы индекса

Методы индекса предоставляют полезные значения индекса, которые точно показывают, где совпадение было найдено во входной строке —

Sr.No. Метод и описание
1

public int start ()

Возвращает начальный индекс предыдущего матча.

2

public int start (группа int)

Возвращает начальный индекс подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления.

3

public int end ()

Возвращает смещение после совпадения последнего символа.

4

public int end (int group)

Возвращает смещение после последнего символа подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления.

public int start ()

Возвращает начальный индекс предыдущего матча.

public int start (группа int)

Возвращает начальный индекс подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления.

public int end ()

Возвращает смещение после совпадения последнего символа.

public int end (int group)

Возвращает смещение после последнего символа подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления.

Методы обучения

Методы исследования проверяют входную строку и возвращают логическое значение, указывающее, найден ли шаблон —

Sr.No. Метод и описание
1

public boolean LookingAt ()

Пытается сопоставить входную последовательность, начиная с начала региона, с шаблоном.

2

public boolean find ()

Пытается найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.

3

публичная логическая находка (int start)

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

4

публичные логические совпадения ()

Попытки сопоставить весь регион с шаблоном.

public boolean LookingAt ()

Пытается сопоставить входную последовательность, начиная с начала региона, с шаблоном.

public boolean find ()

Пытается найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.

публичная логическая находка (int start)

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

публичные логические совпадения ()

Попытки сопоставить весь регион с шаблоном.

Методы замены

Методы замены являются полезными методами для замены текста во входной строке —

Sr.No. Метод и описание
1

public Matcher appendReplacement (StringBuffer sb, String replace)

Реализует нетерминальный шаг добавления и замены.

2

public StringBuffer appendTail (StringBuffer sb)

Реализует шаг добавления и замены терминала.

3

public String replaceAll (замена строки)

Заменяет каждую подпоследовательность входной последовательности, которая соответствует шаблону с данной строкой замены.

4

public String replaceFirst (замена строки)

Заменяет первую подпоследовательность входной последовательности, которая соответствует шаблону с данной строкой замены.

5

public static String quoteReplacement (String s)

Возвращает буквенную замещающую строку для указанной строки. Этот метод создает строку, которая будет работать в качестве литеральной замены в методе appendReplacement класса Matcher.

public Matcher appendReplacement (StringBuffer sb, String replace)

Реализует нетерминальный шаг добавления и замены.

public StringBuffer appendTail (StringBuffer sb)

Реализует шаг добавления и замены терминала.

public String replaceAll (замена строки)

Заменяет каждую подпоследовательность входной последовательности, которая соответствует шаблону с данной строкой замены.

public String replaceFirst (замена строки)

Заменяет первую подпоследовательность входной последовательности, которая соответствует шаблону с данной строкой замены.

public static String quoteReplacement (String s)

Возвращает буквенную замещающую строку для указанной строки. Этот метод создает строку, которая будет работать в качестве литеральной замены в методе appendReplacement класса Matcher.

Методы начала и конца

Ниже приведен пример, который подсчитывает, сколько раз слово «кошка» появляется во входной строке:

пример

Live Demo

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

public class RegexMatches {

   private static final String REGEX = "\\bcat\\b";
   private static final String INPUT = "cat cat cat cattie cat";

   public static void main( String args[] ) {
      Pattern p = Pattern.compile(REGEX);
      Matcher m = p.matcher(INPUT);   // get a matcher object
      int count = 0;

      while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}

Это даст следующий результат —

Выход

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

Вы можете видеть, что этот пример использует границы слов, чтобы гарантировать, что буквы «c» «a» «t» не являются просто подстрокой в ​​более длинном слове. Это также дает некоторую полезную информацию о том, где во входной строке произошло совпадение.

Метод start возвращает начальный индекс подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления, а end возвращает индекс последнего сопоставленного символа плюс один.

Спички и методы поиска

Методы match и LookingAt пытаются сопоставить входную последовательность с шаблоном. Разница, однако, заключается в том, что для сопоставления требуется сопоставление всей входной последовательности, а для lookAt — нет.

Оба метода всегда начинаются с начала строки ввода. Вот пример, объясняющий функциональность —

пример

Live Demo

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

public class RegexMatches {

   private static final String REGEX = "foo";
   private static final String INPUT = "fooooooooooooooooo";
   private static Pattern pattern;
   private static Matcher matcher;

   public static void main( String args[] ) {
      pattern = Pattern.compile(REGEX);
      matcher = pattern.matcher(INPUT);

      System.out.println("Current REGEX is: "+REGEX);
      System.out.println("Current INPUT is: "+INPUT);

      System.out.println("lookingAt(): "+matcher.lookingAt());
      System.out.println("matches(): "+matcher.matches());
   }
}

Это даст следующий результат —

Выход

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

Заменить первый и заменить все методы

Методы replaceFirst и replaceAll заменяют текст, соответствующий заданному регулярному выражению. Как указывают их имена, replaceFirst заменяет первое вхождение, а replaceAll заменяет все вхождения.

Вот пример, объясняющий функциональность —

пример

Live Demo

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

public class RegexMatches {

   private static String REGEX = "dog";
   private static String INPUT = "The dog says meow. " + "All dogs say meow.";
   private static String REPLACE = "cat";

   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      
      // get a matcher object
      Matcher m = p.matcher(INPUT); 
      INPUT = m.replaceAll(REPLACE);
      System.out.println(INPUT);
   }
}

Это даст следующий результат —

Выход

The cat says meow. All cats say meow.

Методы appendReplace и appendTail

Класс Matcher также предоставляет методы appendReplacement и appendTail для замены текста.

Вот пример, объясняющий функциональность —

пример

Live Demo

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

public class RegexMatches {

   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoob";
   private static String REPLACE = "-";
   public static void main(String[] args) {

      Pattern p = Pattern.compile(REGEX);
      
      // get a matcher object
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()) {
         m.appendReplacement(sb, REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

Это даст следующий результат —

Выход

-foo-foo-foo-

Методы класса PatternSyntaxException

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

public String getDescription ()

Получает описание ошибки.

public int getIndex ()

Получает индекс ошибки.

public String getPattern ()

Получает ошибочный шаблон регулярного выражения.

public String getMessage ()

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