Регулярные выражения. всё проще, чем кажется

Введение

Регулярные выражения используются для сжатого описания некоторого
множества строк с помощью шаблонов, без необходимости перечисления
всех элементов этого множества или явного написания функции для проверки.
Большинство символов соответствуют сами себе («a» соответствует «a» и т. д.).
Исключения из этого правила называются метасимволами: .

Термин «Регулярные выражения» является переводом с английского словосочетания «Regular expressions».
Перевод не очень точно отражает смысл, правильнее было бы «шаблонные выражения».
Регулярное выражение, или коротко «регулярка», состоит из обычных символов и специальных командных последовательностей.
Например, задаёт любую цифру, а — задает любую последовательность из одной или более цифр.

Работа с регулярками реализована во всех современных языках программирования.
Однако существует несколько «диалектов», поэтому функционал регулярных выражений может различаться от языка к языку.
В некоторых языках программирования регулярками пользоваться очень удобно (например, в питоне), в некоторых — не слишком (например, в C++).

Примеры регулярных выражений

Регулярка Её смысл
В точности текст «simple text»
Последовательности из 5 цифр
означает любую цифру
— ровно 5 раз
Даты в формате ДД/ММ/ГГГГ (и прочие куски, на них похожие, например, 98/76/5432)
«Слова» в точности из трёх букв/цифр
означает границу слова (с одной стороны буква/цифра, а с другой — нет)
любая буква/цифра,
— ровно три раза
Целое число, например, 7, +17, -42, 0013 (возможны ведущие нули)
— либо -, либо +, либо пусто
— последовательность из 1 или более цифр
Действительное число, возможно в экспоненциальной записиНапример, 0.2, +5.45, -.4, 6e23, -3.17E-14. См. ниже картинку.

Сила и ответственность

Регулярные выражения, или коротко, регулярки — это очень мощный инструмент.
Но использовать их следует с умом и осторожностью, и только там, где они действительно приносят пользу, а не вред.
Во-первых, плохо написанные регулярные выражения работают медленно.
Во-вторых, их зачастую очень сложно читать, особенно если регулярка написана не лично тобой пять минут назад.
В-третьих, очень часто даже небольшое изменение задачи (того, что требуется найти) приводит к значительному изменению выражения.
Поэтому про регулярки часто говорят, что это write only code (код, который только пишут с нуля, но не читают и не правят).
А также шутят: Некоторые люди, когда сталкиваются с проблемой, думают «Я знаю, я решу её с помощью регулярных выражений.» Теперь у них две проблемы.

Не на границе слова: \B

Привязка указывает, что соответствие не должно находиться на границе слова. Это противоположность привязки .

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

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

Шаблон Описание
Совпадение не должно начинаться на границе слова.
Совпадение с подстрокой qu.
Совпадение с одним или несколькими символами слова.

Конец строки или до конца символа новой строки: \Z

Привязка указывает, что соответствие должно находиться в конце входной строки или перед символом в конце входной строки. Она идентична привязке с той разницей, что игнорирует параметр . Таким образом, в многострочной строке она может соответствовать только концу последней строки или последней строке до символа .

Обратите внимание, что соответствует но не соответствует (комбинации символов CR/LF). Для нахождения соответствия CR/LF включите в шаблон регулярного выражения

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

4 ответа

Лучший ответ

Ключ — это значение. соответствует границе слова. Граница слова соответствует позиции, в которой за символом слова не следует или не предшествует другой символ слова

Обратите внимание, что соответствующая граница слова не включена в соответствие. Другими словами, длина совпадающей границы слова равна нулю

Так что сам по себе ничего не соответствует, это просто условие типа , и так далее. Как означает начало со слова-символа, означает слово-символ, за которым не следует слово-символ.

В соответствует только , где символ слова, за которым не следует символ слова здесь, является пробелом, но не .

соответствует в . просто условие не соответствует ничему.

означает слово-символ, за которым следует не слово, а слово-символ противоречиво, поэтому никогда не будет ничего совпадать.

2

linjie
23 Апр 2017 в 09:40

Символ пробела не является границей слова. Граница слова — это не сам символ, это место «между символами», где символ слова переходит в несловесный символ.

Так что соответствует только , но не .

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

5

Dagg Nabbit
24 Дек 2013 в 02:12

означает совпадение:

  1. буквенно-цифровой символ (); с последующим
  2. переход от буквенно-цифровых символов к буквенно-цифровым (или наоборот) (‘\ b’). Но не какой-либо действительный характер; с последующим
  3. буквенно-цифровой символ ().

Ключевым моментом является то, что не потребляет никаких символов, он проверяет, какие символы находятся рядом с тестируемой позицией. Таким образом, соответствует только двум символам, оба должны быть буквенно-цифровыми (), а воображаемая точка между ними должна иметь буквенно-цифровые символы с одной стороны и не алфавитно-цифровые с другой, что, следовательно, невозможно сопоставить ,

Надеюсь это поможет.

1

Adrian Pronk
24 Дек 2013 в 02:20

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

Ваше регулярное выражение делает это:

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

1

hwnd
24 Дек 2013 в 02:45

Символы со специальным значением

Большинство символов в регулярном выражении представляют сами себя за исключением специальных символов               , которые могут быть экранированы символом  (обратная косая черта) для представления самих себя в качестве символов текста. То есть простейшее регулярное выражение можно записать так: , которому будет соответствовать строка abc.

Спец. символ

Значение

Пример

Соответствие

Спец. символ

Значение

Пример

Соответствие

Число повторений 0 и больше

, , 

Один любой символ, исключая символ новой строки

, ,

+

Число повторений 1 и больше

Число повторений 0 или 1

|

Оператор “ИЛИ“

, ,

()

Группировка

,

[]

Список символов, один из которых может присутствовать в тексте

,

Список символов, которые не входят в указанный набор

123

Диапазон символов (используется в квадратных скобках)

, , , , , , , ,

^

Начало строки

aa aaa

$

Конец строки

aaa aa

{}

Количество повторений предыдущего символа.Число повторений — ровно n раз — от m до n включительно — не менее m раз не более n раз

,

Экранирование специальных символов

\b

Граница слова

aa aaaa aa

\B

Не граница слова

aa aa

\s

Пробельный символ

,

\S

Непробельный символ

cccc

\d

Цифровой символ

abc abc

\D

Нецифровой символ

123

\w

Буквенный или цифровой символ, включая знак _

,

\W

Любой символ, кроме буквенного, цифрового или _

123

\r

Возврат каретки

\n

Перевод строки

\t

Знак табуляции

Модификаторы

(?imsxr-imsxr)

Модификаторы служат для изменения режимов работы регулярных выражений.

Любой модификатор может располагаться внутри регулярного выражения с помощью специальной конструкции (?...).

Если эта конструкция расположена внутри подвыражения, то она действует только на это подвыражение.

i
Регистронезависимый режим (используются установленные в вашей системе языковые настройки).
m
Воспринимать входной текст как многострочный, при этом метасимволы «^» и «$» будут совпадать не только в начале и конце текста в целом, но и в начале и в конце всех имеющихся в тексте строк (см. также ).
s
Воспринимать входной текст как одну строку. При этом метасимвол «.» совпадает с любым символом, если же этот модификатор выключен, то он не совпадает с разделителями строк (см. также ). По умолчанию включено.
g
Нестандартный модификатор. Выключая его, вы переключаете все повторители в «не жадный» режим (по умолчанию этот модификатор включен). Т.е. если его отключить, то все «+» работают как «+?», «*» как «*?» и т.д.
x
Позволяет форматировать шаблон, чтобы обеспечить более лёгкую читаемость (см. описание ниже).
r
Нестандартный модификатор. Если включен, то диапазон «а-я» включает в себя также букву «ё», «А-Я» включает «Ё», а «а-Я» включает вообще все русские буквы. По умолчанию включен.
#

(?#text): Комментарий, text просто игнорируется

Обратите внимание, что в комментарии такого вида невозможно использовать символ «)», поскольку он воспринимается как конец комментария.

Несколько примеров:

Примеры с модификаторами
Выражение Результат
(?i)Saint-Petersburg находит «Saint-petersburg» и «Saint-Petersburg»
(?i)Saint-(?-i)Petersburg находит «Saint-Petersburg», но не «Saint-petersburg»
(?i)(Saint-)?Petersburg находит «Saint-petersburg» и «saint-petersburg»
((?i)Saint-)?Petersburg находит «saint-Petersburg», но не «saint-petersburg»

Модификатор x заставляет игнорировать пробелы, табуляции и разделители строк, что позволяет форматировать текст выражения.

Кроме того, если встречается символ #, то все последующие символы до конца строки воспринимаются как комментарий, например:

(
  (abc) # комментарий 1
    |   # Вы можете использовать пробелы для форматирования выражения - TRegExpr игнорирует их
  (efg) # комментарий 2
)

Естественно, это означает, что если вам нужно вставить в выражение пробел, табуляцию, разделитель строки или #, то в расширенном (x) режиме это можно сделать предваряя их «\» или используя escape-последовательность \xnn (внутри наборов символов все эти символы воспринимаются как обычно).

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

Экранирование

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

Их следует экранировать, т.е. поставить обратный слеш (\).

Для чего же он нужен? Рассмотрим простой пример. У нас есть строка с несколькими предложениями, в которых нам необходимо найти точки. Если вы попробуете это сделать, то будут выделены все символы. Дело в том, что точка является специальным метасимволом, которая заменяет любой символ в регулярном выражении, кроме переноса строки (см. ниже).

Нам следует указать, что точка в нашем случае должна быть не метасимволом, а обычным символом-точкой (\.). Экранируя любой метасимвол, мы превращаем его в обычный символ. Это относится и к самому обратному слешу, для экранирования используем \\.

Сопоставление и поиск

Чтобы регулярное выражение соответствовало целевой последовательности, все данное выражение должно соответствовать целевой последовательности целиком. Например, регулярное выражение соответствует целевой последовательности, но не соответствует целевой последовательности или целевой последовательности .

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

Примеры:

  • Поиск регулярного выражения в целевой последовательности выполняется правильно и соответствует всей последовательности. Тот же поиск в целевой последовательности также будет выполнен, и в нем будут сопоставлены последние три символа. Такой же поиск в целевой последовательности также будет выполнен и соответствует первым трем символам.

  • Поиск регулярного выражения в целевой последовательности выполняется правильно и соответствует первым трем символам.

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

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

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

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

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

Группировка

Группы (подмаски) в регулярных выражениях делаются с помощью метасимвола группировки .

Например в выражении xyz+ знак плюс относится только к букве и это выражение ищет слова типа , , . Но если поставить скобки то квантифиактор относится уже к последовательности и регулярка ищет слова , , .

Пример

Попробуй сам

Результат выполнения кода:

1

Ещё примеры:

Выражение Описание
^{1,}$ Любое слово, хотя бы одна буква, число или
+@ Соответствует строке с символом @ в начале, за которым следует любая буква нижнего регистра, число от 0 до 9 или буква верхнего регистра.
()() wy, wz, xy, или xz
+ Один или более символов нижнего регистра

Практические упражнения по регулярным выражениям PHP.

Назад
Вперёд

Только начало строки: \A

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

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

Метасимволы

Символ точки () является метасимволом. Метасимволы — это символы, которые имеют особое значение. Они помогают создавать более интересные шаблоны, чем просто набор конкретных символов. Практически всё, что мы будем рассматривать — будет метасимволами.

Точка () представляет собой любой символ. В следующем примере мы ищем символ , за которым следует любой символ, а за ним символ :

Важно отметить, что точка () соответствует только одному символу. Мы можем заставить её соответствовать более чем одному символу, используя множители, которые мы рассмотрим ниже

Кроме того, вы также можете искать несколько символов с помощью точки следующим образом:

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

Сводка по грамматике

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

Элемент basic extended ECMAScript grep egrep awk
чередование с помощью + + + +
чередование с помощью + +
привязка + + + + + +
обратная ссылка + + +
выражение в квадратных скобках + + + + + +
Группа записи с помощью + + + +
Группа записи с помощью + +
управляющая escape-последовательность +
escape-символ DSW +
escape-выражение формата файлов + +
шестнадцатеричная escape-последовательность +
escape-последовательность удостоверения + + + + + +
отрицательное утверждение +
отрицательное утверждение границы слова +
группа незахвата +
«нежадное» повторение +
восьмеричная escape-последовательность +
обычный символ + + + + + +
положительное утверждение +
повторение с помощью + + + +
повторение с помощью + +
повторение с помощью + + + + + +
повторение с помощью и + + + +
escape-последовательность Юникода +
знак подстановки + + + + + +
утверждение границы слова +

Наборы символов

Вы можете определить набор, заключив символы в []. Набор будет совпадать с любым одним символов из перечисленных в нём.

Если первым символом набора (сразу после «[«) идёт «^», то такой набор совпадает с любым символом не перечисленным в наборе.

Внутри набора символ «-» может быть использован для определения диапазона символов, например, a-z представляет все символы между «a» и «z», включительно.

Если необходимо включить в набор сам символ «-«, поместите его в начало или конец набора или предварите символом «\».

Если вам необходимо поместить в набор сам символ «]», поместите его в самое начало или предварите «\».

Наборы символов
Выражение Результат
«a», «z» или «-«
«a», «z» или «-«
«a», «z» или «-«
любая из 26 строчных латинских букв от «a» до «z»
#10, #11, #12 или #13
цифра, «-» или «t»
[]-a] символ из диапазона «]»..»a»

Примеры:

Примеры с наборами символов
Выражение Результат
foobr находит «foobar», «foober» и т.д., но не «foobbr», «foobcr» и т.д.
foobr находит «foobbr», «foobcr» и т.д., но не «foobar», «foober» и т.д.

Сопоставление шаблонов с помощью |

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

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

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

Шаблон Описание
Начало на границе слова.
Соответствует символам gr.
Соответствует букве «a» или «e».
Соответствует символу у на границе слова.

С помощью символа также можно выполнить сопоставление «или/либо» с несколькими символами или частями выражения, которые могут включать любую комбинацию символьных литералов и элементов языка регулярных выражений. (Класс символов не предоставляет эту функцию). В следующем примере символ используется для извлечения номера социального страхования США (SSN), который состоит из 9 цифр в формате ddd-dd-dddd, или номера идентификации работодателя США (EIN), который состоит из 9 цифр в формате dd-ddddddd.

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

Шаблон Описание
Начало на границе слова.
Сопоставьте любые из следующих значений: два десятичных знака, за которыми следует дефис и еще семь десятичных знаков; или последовательность из трех десятичных знаков, дефиса, двух десятичных знаков, еще одного дефиса и четырех десятичных знаков.
Совпадение должно заканчиваться на границе слова.

Метасимволы

В регулярных выражениях используются два типа символов: обычные символы и метасимволы. Обычные символы — это те символы, которые имеют «буквальное» значение, а метасимволы — это те символы, которые имеют «особое» значение в регулярном выражении.

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

Одним из основных метасимволов является обратный слэш (\), который меняет тип символа, следующего за ним, на противоположный. Таким образом обычный символ можно превратить в метасимвол, а если это был метасимвол, то он теряет свое специальное значение и становится обычным символом. Этот приём нужен для того, чтобы вставлять в текст специальные символы как обычные. Например, символ в обычном режиме не имеет никаких специальных значений, но — это уже метасимвол, который обозначает: «любая цифра». Символ точка в обычном режиме значит — «любой единичный символ», а экранированная точка (\.) означает просто точку.

Метасимвол Описание пример
. Соответствует любому одиночному символу, кроме новой строки. /./ соответствует строке, состоящей из одного символа.
^ Соответствует началу строки. /^cars/ соответствует любой строке, которая начинается с cars.
$ Соответствует шаблону в конце строки. /com$/ соответствует строке, заканчивающейся на com, например gmail.com
* Соответствует 0 или более вхождений. /com*/ соответствует commute, computer, compromise и т.д.
+ Соответствующий предыдущему символу появляется как минимум один раз. Например, /z+oom/ соответствует zoom.
\ Используется для удаления метасимволов в регулярном выражении. /google\.com/ будет рассматривать точку как буквальное значение, а не как метасимвол.
a-z Соответствует строчным буквам. cars
A-Z Соответствует буквам в верхнем регистре. CARS
0-9 Соответствует любому числу от 0 до 9. /0-5/ соответствует 0, 1, 2, 3, 4, 5
Соответствует классу символов. // соответствует pqr
| Разделяет перечисление альтернативных вариантов. /(cat|dog|fish)/ соответствует cat или dog или fish
\d Любая цифра. /(\d)/ соответствует цифре
\s Найти пробельный символ (в т.ч. табуляция). /(\s)/ соответствует пробелу
\b Граница слова (начало или конец). /\bWORD/ найти совпадение в начале слова

Количественные повторители (квантификаторы)

В предыдущем разделе мы узнали, как найти один символ в строке. Но что, если вы хотите сопоставить более одного символа? Например, допустим, вы хотите найти слова, содержащие один или несколько символов буквы p, или слова, содержащие не менее двух символов p.

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

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

RegExp Что оно делает
Соответствует одному или нескольким вхождениям буквы p.
Соответствует нулю или более вхождений буквы p.
Соответствует нулю или одному вхождению буквы p.
Соответствует ровно двум вхождениям буквы p.
Соответствует как минимум двум вхождениям буквы p, но не более трех вхождений.
Соответствует двум или более вхождениям буквы p.
Совпадает не более чем с тремя вхождениями буквы p.

Регулярное выражение в следующем примере разбивает строку на последовательность символов с помощью метода JavaScript :

Статичные регэкспы

В некоторых реализациях javascript регэкспы, заданные коротким синтаксисом /…/ — статичны. То есть, такой объект создается один раз в некоторых реализациях JS, например в Firefox. В Chrome все ок.

function f() {
  // при многократных заходах в функцию объект один и тот же
  var re = /lalala/     
}

По стандарту эта возможность разрешена ES3, но запрещена ES5.

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

При поиске всех совпадений в цикле проблем не возникает, т.к. последняя итерация (неудачная) обнуляет .

Якоря

При определении новых строк мы всегда можем ссылаться на 2 конкретных местоположения в строке — на начало и на конец строки:

    (символ каретки) — представляет начало строки;

    (символ доллара) — представляет конец строки.

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

Это, на самом деле, не так (по отношению к регулярным выражениям). Начало строки — это символ нулевой ширины, который находится непосредственно перед «В», а конец строки — это символ нулевой ширины, который находится сразу после точки. Под «нулевой шириной» мы подразумеваем, что при написании эти символы не отображаются. Они есть, но мы не можем их видеть

О строке, приведенной выше, люди обычно говорят, что буква «В» в слове «Важно» и точка в конце обозначают начало и конец строки. Это, на самом деле, не так (по отношению к регулярным выражениям)

Начало строки — это символ нулевой ширины, который находится непосредственно перед «В», а конец строки — это символ нулевой ширины, который находится сразу после точки. Под «нулевой шириной» мы подразумеваем, что при написании эти символы не отображаются. Они есть, но мы не можем их видеть.

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

Допустим, мы хотим найти число, но при условии, что оно является первым элементом строки:

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

Логические Операторы

Java Regex API поддерживает набор логических операторов, которые можно использовать для объединения нескольких подшаблонов в одном регулярном выражении, а именно оператор and и оператор or.

String text = "Cindarella and Sleeping Beauty sat in a tree";

Pattern pattern = Pattern.compile(".*");
Matcher matcher = pattern.matcher(text);

System.out.println("matcher.matches() = " + matcher.matches());

Поскольку в регулярном выражении между этими подшаблонами нет символов, между ними неявно существует оператор and. Это означает, что целевая строка должна соответствовать всем 3 подшаблонам в данном порядке, чтобы соответствовать регулярному выражению в целом. Как видно из строки, выражение соответствует строке. Строка должна начинаться с заглавной или строчной буквы C, за которой следует заглавная или строчная буква I, а затем ноль или более символов. Строка соответствует этим критериям.

String text = "Cindarella and Sleeping Beauty sat in a tree";

Pattern pattern = Pattern.compile(".*Ariel.*|.*Sleeping Beauty.*");
Matcher matcher = pattern.matcher(text);

System.out.println("matcher.matches() = " + matcher.matches());

Как вы можете видеть, шаблон будет соответствовать либо подчиненному шаблону Ariel, либо подчиненному шаблону Sleeping Beauty где-то в целевой строке. Поскольку целевая строка содержит текст «Sleeping Beauty», выражение соответствует целевой строке.

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

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

$exp = "/wm-school/i";

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

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

5.1. Метасимволы — разделители строк

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

Разделители строк
Выражение Результат
^ начало строки
$ конец строки
\A начало текста
\Z конец текста
. любой символ в строке

Несколько примеров:

Примеры с разделителями строк
Выражение Результат
^foobar находит «foobar» только в начале строки
foobar$ находит «foobar» только в конце строки
^foobar$ находит «foobar» только если это единственное слово в строке
foob.r находит «foobar», «foobbr», «foob1r» и т.д.

Метасимвол «^» по умолчанию совпадает только с началом входного текста, а метасимвол «$» — только с концом текста. Внутренние разделители строк, имеющиеся в тексте, не будут совпадать с «^» и «$».

Однако, если вам необходимо работать с текстом как с многострочным, чтобы «^» совпадал после каждого разделителя строки внутри текста, а «$» — перед каждым разделителем, то вы можете включить .

Метасимволы \A и \Z аналогичны «^» и «$», но на них не действует , т.е. они всегда совпадают только с началом и концом всего входного текста.

Метасимвол «.» по умолчанию совпадает с любым символом, однако, если вы выключите , то «.» не будет совпадать с разделителями строк.

TRegExpr интерпретирует разделители строк так, как это рекомендовано на www.unicode.org в Technical Standard #18:

«^» совпадает с началом входного текста, а также, если включен , с точкой, непосредственно следующей после \x0D\x0A, \x0A или \x0D (если вы используете TRegExpr, то также \x2028, \x2029, \x0B, \x0C или \x85)

Обратите внимание, что он не совпадает в промежутке внутри последовательности \x0D\x0A

«$» совпадает с концом входного текста, а также, если включен , с точкой, непосредственно предшествующей \x0D\x0A, \x0A или \x0D (если вы используете TRegExpr, то также \x2028, \x2029, \x0B, \x0C или \x85)

Обратите внимание, что он не совпадает в промежутке внутри последовательности \x0D\x0A

«.» совпадает с любым символом, но если выключен , то «.» не совпадает с \x0D\x0A, \x0A и \x0D (если вы используете TRegExpr, то не совпадает также с \x2028, \x2029, \x0B, \x0C и \x85).

Обратите внимание, что «^.*$» (шаблон для пустой строки) не совпадает с пустой строкой вида \x0D\x0A, но совпадает с \x0A\x0D

Заключение

Резюмируем то, что мы узнали:

    — соответствует любому «пробельному» символу (например: пробел, символ табуляции, символ новой строки и т.д.);

    — соответствует любому символу, который не относится к «пробельным»;

    — соответствует любому символу, который является цифрой ();

    — соответствует любому символу, который не является цифрой;

    — соответствует любому символу, который является строковым символом (, , и );

    — соответствует любому символу, который не является строковым символом;

    — соответствует символу табуляции;

    — соответствует символу возврата каретки;

    — соответствует символу новой строки;

    — якорь, который обозначает начало строки;

    — якорь, который обозначает конец строки;

    — соответствует началу или концу слова.

    — соответствует началу слова.

    — соответствует концу слова.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: