Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

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

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

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

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

Захват групп

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

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

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

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

Пример

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

Живая демонстрация
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 —

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

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

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

Методы индексирования

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

<тд>

открытое целое начало()

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

<тд>

public int start(int group)

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

<тд>

открытое целое число end()

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

<тд>

public int end(int group)

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

Сер.№ Метод и описание
1
2
3
4

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

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

<тд>

общедоступное логическое значение lookAt()

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

<тд>

общедоступный логический поиск()

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

<тд>

общедоступный логический поиск(int start)

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

<тд>

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

Пытается сопоставить всю область с шаблоном.

Сер.№ Метод и описание
1
2
3
4

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

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

<тд>

public Matcher appendReplacement(StringBuffer sb, замена строки)

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

<тд>

общедоступный StringBuffer appendTail(StringBuffer sb)

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

<тд>

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

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

<тд>

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

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

<тд>

public static String quoteReplacement(String s)

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

Сер.№ Метод и описание
1
2
3
4
5

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

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

Пример

Живая демонстрация
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 и lookAt пытаются сопоставить входную последовательность с шаблоном. Разница, однако, в том, что для сопоставления требуется соответствие всей входной последовательности, а для lookAt - нет.

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

Пример

Живая демонстрация
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 заменяют текст, соответствующий заданному регулярному выражению. Как видно из их названий, replaceFirst заменяет первое вхождение, а replaceAll заменяет все вхождения.

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

Пример

Живая демонстрация
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.

Методы appendReplacement и appendTail

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

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

Пример

Живая демонстрация
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 предоставляет следующие методы, помогающие определить, что пошло не так:

<тд>

общедоступная строка getDescription()

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

<тд>

общедоступный интервал getIndex()

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

<тд>

общедоступная строка getPattern()

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

<тд>

общедоступная строка getMessage()

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

Сер.№ Метод и описание
1
2
3
4

java

  1. Выражения, операторы и блоки C# (с примерами)
  2. Операторы Java
  3. Java-выражения, операторы и блоки
  4. Java-комментарии
  5. Java для каждого цикла
  6. Java-строки
  7. Java-интерфейс
  8. Java-проба с ресурсами
  9. Java-аннотации
  10. Утверждения Java