Регулярные выражения определяют шаблоны строк.
Регулярные выражения можно использовать для поиска, редактирования или манипулирования текстом.
Регулярные выражения не ограничиваются одним языком, в каждом языке есть небольшие различия.
Регулярные выражения Java наиболее похожи на выражения Perl.
Пакет java.util.regex в основном включает следующие три класса:
Класс шаблона:
Объект шаблона представляет собой скомпилированное представление регулярного выражения. Класс шаблона не имеет открытого конструктора. Чтобы создать объект Pattern, вы должны сначала вызвать его общедоступный статический метод компиляции, который возвращает объект Pattern. Этот метод принимает регулярное выражение в качестве первого параметра.
Класс сопоставителя:
Объект Matcher — это механизм, который интерпретирует и сопоставляет входные строки. Как и класс Pattern, Matcher не имеет открытого конструктора. Вам необходимо вызвать метод сопоставления объекта Pattern, чтобы получить объект Matcher.
ПаттерсинтаксИсключение:
PatternSyntaxException — это необязательный класс исключений, который представляет синтаксическую ошибку в шаблоне регулярного выражения.
Группы захвата — это способ рассматривать несколько символов как единое целое, создаваемое путем группировки символов в круглых скобках.
Например, регулярное выражение (собака) создает одну группу, содержащую «d», «o» и «g».
Группы захвата нумеруются путем подсчета открывающих скобок слева направо. Например, в выражении ((A)(B(C))) таких групп четыре:
((А)(В(С)))
(А)
(Б(С))
(С)
Вы можете проверить, сколько групп имеет выражение, вызвав метод groupCount объекта сопоставления. Метод groupCount возвращает значение int, указывающее, что объект сопоставления в настоящее время имеет несколько групп захвата.
Существует также специальная группа (группа 0), которая всегда представляет все выражение. Группа не включается в возвращаемое значение groupCount.
В следующем примере показано, как найти строку цифр из заданной строки:
импортировать java.util.regex.Matcher;
импортировать java.util.regex.Pattern;
открытый класс RegexMatches
{
public static void main( String args[] ){
// Поиск строки по заданному шаблону String line = "Этот ордер был установлен на QT3000! ОК?";
Строковый шаблон = "(.*)(\d+)(.*)";
//Создаем объект Pattern Pattern r = Pattern.compile(pattern);
// Теперь создаем объект сопоставления Matcher m = r.matcher(line);
если (m.find( )) {
System.out.println("Найдено значение: " + m.group(0) );
System.out.println("Найдено значение: " + m.group(1) );
System.out.println("Найдено значение: " + m.group(2) );
} еще {
System.out.println("НЕТ СОВПАДЕНИЯ");
}
}
}
Результаты компиляции и запуска приведенного выше примера следующие:
Найдено значение: Этот заказ был размещен на QT3000. Хорошо?
Найдено значение: Этот заказ был размещен на QT300.
Найдено значение: 0
характер | иллюстрировать |
---|---|
| Отметьте следующий символ как специальный символ, текст, обратную ссылку или восьмеричный escape-символ. Например, «n» соответствует символу «n». «n» соответствует символу новой строки. Последовательность "\" соответствует "", а "(" соответствует "(". |
^ | Соответствует началу входной строки. Если установлено свойство Multiline объекта RegExp , ^ также будет соответствовать позиции после «n» или «r». |
$ | Соответствует концу входной строки. Если установлено свойство Multiline объекта RegExp , $ также будет соответствовать позиции перед «n» или «r». |
* | Соответствует предыдущему символу или подвыражению ноль или более раз. Например, zo* соответствует «z» и «zoo». * Эквивалент {0,}. |
+ | Соответствует предыдущему символу или подвыражению один или несколько раз. Например, «zo+» соответствует «zo» и «zoo», но не соответствует «z». + Эквивалент {1,}. |
? | Соответствует предыдущему символу или подвыражению ноль или один раз. Например, «do(es)?» соответствует «do» или «do» в слове «does». ? Эквивалент {0,1}. |
{ н } | n — неотрицательное целое число. Сопоставьте ровно n раз. Например, "o{2}" не соответствует "o" в слове "Bob", но соответствует обеим "o" в слове "food". |
{ н ,} | n — неотрицательное целое число. Сопоставьте не менее n раз. Например, «o{2,}» не соответствует «o» в «Bob», но соответствует всем «o» в «foooood». «o{1,}» эквивалентно «o+». «o{0,}» эквивалентно «o*». |
{ п , м } | M и n — неотрицательные целые числа, где n <= m . Совпадите не менее n раз и не более m раз. Например, «o{1,3}» соответствует первым трем «о» в слове «фуоооод». 'o{0,1}' эквивалентно 'o?'. Примечание. Между запятыми и числами нельзя вставлять пробелы. |
? | Если этот символ следует сразу за любым другим квалификатором (*, +, ?, { n }, { n ,}, { n , m }), шаблон соответствия является «нежадным». «Нежадный» шаблон соответствует самой короткой возможной строке, тогда как «жадный» шаблон по умолчанию соответствует самой длинной возможной строке. Например, в строке «oooo» «o+?» соответствует только одному «o», а «o+» соответствует всем «o». |
. | Соответствует любому одиночному символу, кроме "rn". Чтобы сопоставить любой символ, включая «rn», используйте шаблон, например «[sS]». |
( шаблон ) | Соответствует шаблону и фиксирует соответствующее подвыражение. Захваченные совпадения можно получить из результирующей коллекции «совпадений», используя атрибуты $0…$9 . Чтобы соответствовать символу скобки ( ), используйте «(» или «)». |
(?: шаблон ) | Подвыражение, которое соответствует шаблону , но не фиксирует совпадение, т. е. оно не фиксирует совпадение и не сохраняет совпадение для последующего использования. Это полезно при объединении частей шаблона с помощью символа «или» (|). Например, 'industr(?:y|ies) является более экономичным выражением, чем 'industry|industries'. |
(?= шаблон ) | Подвыражение, выполняющее упреждающий поиск, который соответствует строке в начале строки, соответствующей шаблону . Это совпадение без захвата, т. е. совпадение, которое нельзя захватить для последующего использования. Например, «Windows (?=95|98|NT|2000)» соответствует «Windows» в «Windows 2000», но не соответствует «Windows» в «Windows 3.1». Прогнозы прогнозирования не занимают символы, то есть после совпадения следующее совпадение ищется сразу после предыдущего совпадения, а не после символов, составляющих прогноз прогнозирования. |
(?! шаблон ) | Подвыражение, выполняющее обратный просмотр вперед, соответствующее строке поиска, которая не находится в начале строки, соответствующей шаблону . Это совпадение без захвата, т. е. совпадение, которое нельзя захватить для последующего использования. Например, «Windows (?!95|98|NT|2000)» соответствует «Windows» в «Windows 3.1», но не соответствует «Windows» в «Windows 2000». Прогнозы прогнозирования не занимают символы, то есть после совпадения следующее совпадение ищется сразу после предыдущего совпадения, а не после символов, составляющих прогноз прогнозирования. |
х | у | Сопоставьте x или y . Например, «z|food» соответствует «z» или «food». '(z|f)ood' соответствует "zood" или "food". |
[ хиз ] | Набор символов. Соответствует любому символу, содержащемуся в . Например, «[abc]» соответствует «a» в слове «plain». |
[^ хиз ] | Обратный набор символов. Соответствует любым не включенным символам. Например, «[^abc]» соответствует «p», «l», «i» и «n» в слове «plain». |
[ а- з ] | Диапазон символов. Соответствует любому символу в указанном диапазоне. Например, «[az]» соответствует любой строчной букве в диапазоне от «a» до «z». |
[^ аз ] | Символ обратного диапазона. Соответствует любому символу, находящемуся за пределами указанного диапазона. Например, «[^az]» соответствует любому символу, который не находится в диапазоне от «a» до «z». |
б | Соответствует границе слова, то есть положению между словом и пробелом. Например, «erb» соответствует «er» в слове «никогда», но не соответствует «er» в слове «глагол». |
Б | Сопоставление границ без слов. «erB» соответствует «er» в слове «глагол», но не соответствует «er» в слове «никогда». |
с х | Соответствует управляющему символу, указанному x . Например, cM соответствует Control-M или символу возврата каретки. Значение x должно находиться в диапазоне AZ или az. Если это не так, предполагается, что c — это сам символ «c». |
д | Сопоставление числовых символов. Эквивалентно [0-9]. |
Д | Соответствует нечисловым символам. Эквивалентно [^0-9]. |
е | Подача формы совпадает. Эквивалентно x0c и cL. |
п | Соответствие новой строки. Эквивалентно x0a и cJ. |
р | Соответствует символу возврата каретки. Эквивалентно x0d и cM. |
с | Соответствует любому пробельному символу, включая пробелы, табуляцию, подачу формы и т. д. Эквивалентно [fnrtv]. |
С | Соответствует любому символу без пробелов. Эквивалентно [^fnrtv]. |
т | Соответствие вкладок. Эквивалентно x09 и cI. |
в | Соответствие вертикальной табуляции. Эквивалентно x0b и cK. |
ш | Соответствует любому символу типа, включая подчеркивание. Эквивалентно «[A-Za-z0-9_]». |
В | Соответствует любому символу, не являющемуся словом. Эквивалентно «[^A-Za-z0-9_]». |
х н | Соответствует n , где n — шестнадцатеричный escape-код. Шестнадцатеричный escape-код должен состоять ровно из двух цифр. Например, «x41» соответствует «A». «x041» эквивалентно «x04»&»1». Разрешить использование кодов ASCII в регулярных выражениях. |
число | Соответствует num , где num — положительное целое число. Обратная ссылка для захвата совпадения. Например, «(.)1» соответствует двум последовательным одинаковым символам. |
п | Идентифицирует восьмеричный escape-код или обратную ссылку. Если n предшествует хотя бы n записывающих подвыражений, то n является обратной ссылкой. В противном случае, если n — восьмеричное число (0–7), то n — восьмеричный escape-код. |
нм | Идентифицирует восьмеричный escape-код или обратную ссылку. Если перед nm стоит хотя бы nm, записывающее подвыражения, то nm является обратной ссылкой. Если nm предшествует хотя бы n записей, n — это обратная ссылка, за которой следует символ m . Если ни одно из предыдущих условий не существует, nm соответствует восьмеричному значению nm , где n и m — восьмеричные цифры (0–7). |
нмл | Если n — восьмеричное число (0–3), а m и l — восьмеричные числа (0–7), соответствует восьмеричному escape-коду nml . |
ты н | Соответствует n , где n — символ Юникода, представленный в виде четырехзначного шестнадцатеричного числа. Например, u00A9 соответствует символу авторского права (©). |
Метод index предоставляет полезные значения индекса, которые точно указывают, где во входной строке найдено совпадение:
серийный номер | Методы и инструкции |
---|---|
1 | public int start() возвращает начальный индекс предыдущего совпадения. |
2 | public int start(int group) Возвращает начальный индекс подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления. |
3 | public int end() возвращает смещение после последнего совпадающего символа. |
4 | public int end(int group) Возвращает смещение после последнего символа подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления. |
Метод исследования проверяет входную строку и возвращает логическое значение, указывающее, был ли найден шаблон:
серийный номер | Методы и инструкции |
---|---|
1 | public boolean LookingAt() пытается сопоставить входную последовательность, начиная с начала диапазона, с этим шаблоном. |
2 | public boolean find() пытается найти следующую подпоследовательность входной последовательности, соответствующую этому шаблону. |
3 | public boolean find(int start) Сбрасывает это средство сопоставления, а затем пытается найти следующую подпоследовательность входной последовательности, начиная с указанного индекса, соответствующую этому шаблону. |
4 | public boolean match() пытается сопоставить весь диапазон с шаблоном. |
Метод замены — это метод замены текста во входной строке:
серийный номер | Методы и инструкции |
---|---|
1 | public MatcherappendReplacement(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. |
Вот пример подсчета количества вхождений слова «кот» во входную строку:
импортировать java.util.regex.Matcher;
импортировать java.util.regex.Pattern;
открытый класс RegexMatches
{
частная статическая окончательная строка REGEX = "\bcat\b";
частная статическая окончательная строка INPUT =
«кошка, кошка, кошка, кошка, кошка»;
public static void main( String args[] ){
Шаблон p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // Получаем объект сопоставления int count = 0;
в то время как (m.find()) {
считать++;
System.out.println("Номер совпадения "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
Результаты компиляции и запуска приведенного выше примера следующие:
Матч №1
старт(): 0
конец(): 3
Матч №2
старт(): 4
конец(): 7
Матч №3
старт(): 8
конец(): 11
Матч №4
старт(): 19
конец(): 22
Вы можете видеть, что в этом примере используются границы слов, чтобы гарантировать, что буквы «c», «a», «t» не являются просто подстрокой более длинного слова. Он также предоставляет некоторую полезную информацию о том, где во входной строке произошло совпадение.
Метод start возвращает начальный индекс подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления, а метод end добавляет единицу к индексу последнего совпавшего символа.
Методы match и LookingAt используются для попытки сопоставить шаблон входной последовательности. Разница между ними в том, что для match требуется совпадение всей последовательности, а для LookingAt этого не требуется.
Эти два метода часто используются в начале входной строки.
Для объяснения этой функции мы используем следующий пример:
импортировать java.util.regex.Matcher;
импортировать java.util.regex.Pattern;
открытый класс RegexMatches
{
частная статическая окончательная строка REGEX = "foo";
частная статическая окончательная строка INPUT = "фуооооооооооо";
частный статический шаблон шаблона;
частный статический сопоставитель Matcher;
public static void main( String args[] ){
шаблон = Pattern.compile(REGEX);
сопоставитель = шаблон.сопоставитель(ВХОД);
System.out.println("Текущее REGEX: "+REGEX);
System.out.println("Текущий ВХОД: "+ВХОД);
System.out.println(" LookingAt(): "+matcher. LookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
Результаты компиляции и запуска приведенного выше примера следующие:
Текущее REGEX: foo
Текущий ВХОД: фууууууууууууу
смотряАт(): правда
совпадения(): ложь
Методы replaceFirst и replaceAll используются для замены текста, соответствующего регулярному выражению. Разница в том, что replaceFirst заменяет первое совпадение, а replaceAll заменяет все совпадения.
Следующий пример объясняет эту функциональность:
импортировать java.util.regex.Matcher;
импортировать java.util.regex.Pattern;
открытый класс RegexMatches
{
частная статическая строка REGEX = «собака»;
Private static String INPUT = "Собака говорит мяу." +
«Все собаки говорят мяу»;
частная статическая строка REPLACE = "кот";
public static void main(String[] args) {
Шаблон p = Pattern.compile(REGEX);
// получаем объект сопоставления
Сопоставитель m = p.matcher(INPUT);
ВВОД = m.replaceAll(ЗАМЕНИТЬ);
System.out.println(ВХОД);
}
}
Результаты компиляции и запуска приведенного выше примера следующие:
Кот говорит мяу. Все кошки говорят мяу.
Класс Matcher также предоставляет методы AppendReplacement и AppendTail для замены текста:
Посмотрите на следующий пример, чтобы объяснить эту функциональность:
импортировать java.util.regex.Matcher;
импортировать java.util.regex.Pattern;
открытый класс RegexMatches
{
частная статическая строка REGEX = "a*b";
частная статическая строка INPUT = "aabfooaabfooabfoob";
частная статическая строка REPLACE = "-";
public static void main(String[] args) {
Шаблон p = Pattern.compile(REGEX);
// Получаем объект сопоставления Matcher m = p.matcher(INPUT);
StringBuffer sb = новый StringBuffer();
в то время как (m.find()) {
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
Результаты компиляции и запуска приведенного выше примера следующие:
-фу-фу-фу-
PatternSyntaxException — это непринудительный класс исключений, который указывает на синтаксическую ошибку в шаблоне регулярного выражения.
Класс PatternSyntaxException предоставляет следующие методы, которые помогут нам увидеть, какие ошибки произошли.
серийный номер | Методы и инструкции |
---|---|
1 | public String getDescription() Получает описание ошибки. |
2 | public int getIndex() получает неверный индекс. |
3 | public String getPattern() получает неправильный шаблон регулярного выражения. |
4 | public String getMessage() возвращает многострочную строку, содержащую описание синтаксической ошибки и ее индекс, шаблон регулярного выражения ошибки и визуальное указание индекса ошибки в шаблоне. |