Java — регулярные выражения
Java предоставляет пакет java.util.regex для сопоставления шаблонов с регулярными выражениями. Регулярные выражения Java очень похожи на язык программирования Perl, и их очень легко освоить.
Регулярное выражение — это специальная последовательность символов, которая помогает сопоставлять или находить другие строки или наборы строк, используя специальный синтаксис, хранящийся в шаблоне. Их можно использовать для поиска, редактирования или управления текстом и данными.
Пакет java.util.regex в основном состоит из следующих трех классов —
-
Класс шаблона − Объект Pattern — это скомпилированное представление регулярного выражения. Класс Pattern не предоставляет общедоступных конструкторов. Чтобы создать шаблон, вы должны сначала вызвать один из его общедоступных статических методов compile(). методы, которые затем вернут объект Pattern. Эти методы принимают регулярное выражение в качестве первого аргумента.
-
Класс сопоставления − Объект Matcher — это механизм, который интерпретирует шаблон и выполняет операции сопоставления с входной строкой. Как и класс Pattern, Matcher не определяет общедоступных конструкторов. Вы получаете объект Matcher, вызывая функцию matcher(). метод объекта Pattern.
-
Исключение синтаксиса шаблона − Объект PatternSyntaxException — это непроверенное исключение, указывающее на синтаксическую ошибку в шаблоне регулярного выражения.
Захват групп
Группы захвата — это способ обработки нескольких символов как единого целого. Они создаются путем помещения символов, которые должны быть сгруппированы, внутри набора круглых скобок. Например, регулярное выражение (собака) создает одну группу, содержащую буквы "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
Вот список полезных методов экземпляра —
Методы индексирования
Методы индекса предоставляют полезные значения индекса, которые точно показывают, где во входной строке было найдено совпадение —
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>
Методы изучения
Методы исследования просматривают входную строку и возвращают логическое значение, указывающее, найден ли шаблон —
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>
Методы замены
Методы замены — это полезные методы замены текста во входной строке —
Сер.№ | Метод и описание |
---|---|
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 предоставляет следующие методы, помогающие определить, что пошло не так:
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>
java