Регулярные выражения — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
Строка 120: Строка 120:
  
  
'''Утверждения'''  
+
'''Утверждения'''<br/>
 
Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».
 
Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».
 
  [^\s]*q(?!werty)[^\s]*
 
  [^\s]*q(?!werty)[^\s]*
Строка 126: Строка 126:
  
 
Итак, парсер проверяет несколько следующих символов по предложенному шаблону (<font color=blue>werty</font>). Если они найдены, то утверждение ложно, а значит символ <font color=blue>q</font> будет «проигнорирован», т. е. не будет соответствовать шаблону. Если же <font color=blue>werty</font> не найдено, то утверждение верно, и с <font color=blue>q</font> все в порядке. Затем продолжается поиск любых символов, кроме пробела (<font color=blue>[^\s]*</font>).
 
Итак, парсер проверяет несколько следующих символов по предложенному шаблону (<font color=blue>werty</font>). Если они найдены, то утверждение ложно, а значит символ <font color=blue>q</font> будет «проигнорирован», т. е. не будет соответствовать шаблону. Если же <font color=blue>werty</font> не найдено, то утверждение верно, и с <font color=blue>q</font> все в порядке. Затем продолжается поиск любых символов, кроме пробела (<font color=blue>[^\s]*</font>).
 +
 +
 +
'''Кванторы'''<br/>
 +
Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:
 +
a{10,20}
 +
По умолчанию кванторы — «жадные». Поэтому квантор <font color=blue>+</font>), означающий «один или больше раз», будет соответствовать максимально возможному значению. Иногда это вызывает проблемы, и тогда вы можете сказать квантору перестать быть жадным (стать «ленивым»), используя специальный модификатор. Посмотрите на этот код:
 +
".*"
 +
Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:
 +
 +
<a href="helloworld.htm" title="Привет, Мир">Привет, Мир</a>
 +
 +
Приведенный выше шаблон найдет в этой строке вот такую подстроку:
 +
"helloworld.htm" title="Привет, Мир"
 +
Он оказался слишком жадным, захватив наибольший кусок текста, который смог.
 +
".*?"
 +
Этот шаблон также соответствует любым символам, заключенным в двойные кавычки. Но ленивая версия (обратите внимание на модификатор <font color=blue>?</font>)) ищет наименьшее из возможных вхождений, и поэтому найдет каждую подстроку в двойных кавычках по отдельности:
 +
"helloworld.htm" "Привет, Мир"
  
  

Версия 11:06, 13 ноября 2020

Квантификаторы

Аналог Пример Описание
? {0,1} a? одно или ноль вхождений "а"
+ {1,} a+ одно или более вхождений "а"
* {0,} a* ноль или более вхождений "а"


Модификаторы
Символ «минус» (-) меред модификатором (за исключением U) создаёт его отрицание.

Описание
g глобальный поиск (обрабатываются все совпадения с шаблоном поиска)
i игнорировать регистр
m многострочный поиск. Пояснение: по умолчанию текст это одна строка, с модификатором есть отдельные строки, а значит ^- начало строки в тексте, $- конец строки в тексте.
s текст воспринимается как одна строка, спец символ «точка» (.) будет включать и перевод строки
u используется кодировка UTF-8
U инвертировать жадность
x игнорировать все неэкранированные пробельные и перечисленные в классе символы


Спецсимволы

Аналог Описание
() подмаска, вложенное выражение
[] групповой символ
{a,b} количество вхождений от "a" до "b"
логическое "или", в случае с односимвольными альтернативами используйте []
\ экранирование спец символа
. любой символ, кроме перевода строки
\d [0-9] десятичная цифра
\D [^\d] любой символ, кроме десятичной цифры
\f конец (разрыв) страницы
\n перевод строки
\pL буква в кодировке UTF-8 при использовании модификатора u
\r возврат каретки
\s [ \t\v\r\n\f] пробельный символ
\S [^\s] любой символ, кроме пробельного
\t табуляция
\w [0-9a-z_] любая цифра, буква или знак подчеркивания
\W [^\w] любой символ, кроме цифры, буквы или знака подчеркивания
\v вертикальная табуляция


Спецсимволы внутри символьного класса

Пример Описание
^ [^da] отрицание, любой символ кроме "d" или "a"
- [a-z] интервал, любой символ от "a" до "z"


Позиция внутри строки

Пример Соответствие Описание
^ ^a aaa aaa начало строки
$ a$ aaa aaa конец строки
\A \Aa aaa aaa
aaa aaa
начало текста
\z a\Z aaa aaa
aaa aaa
конец текста
\b a\b
\ba
aaa aaa
aaa aaa
граница слова, утверждение: предыдущий символ словесный, а следующий - нет, либо наоборот
\B \Ba\B aaa aaa отсутствие границы слова
\G \Ga aaa aaa Предыдущий успешный поиск, поиск остановился на 4-й позиции — там, где не нашлось a


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

^[0-9]+

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


Символьные классы
Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, \d соответствует любой цифре от 0 до 9 включительно, \w соответствует буквам и цифрам, а \W— всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:

\w\s


Утверждения
Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».

[^\s]*q(?!werty)[^\s]*

Приведенный выше код начинается с поиска любых символов, кроме пробела ([^\s]*), за которыми следует q. Затем парсер достигает «смотрящего вперед» утверждения. Это автоматически делает предшествующий элемент (символ, группу или символьный класс) условным — он будет соответствовать шаблону, только если утверждение верно. В нашем случае, утверждение является отрицательным (?!), т. е. оно будет верным, если то, что в нем ищется, не будет найдено.

Итак, парсер проверяет несколько следующих символов по предложенному шаблону (werty). Если они найдены, то утверждение ложно, а значит символ q будет «проигнорирован», т. е. не будет соответствовать шаблону. Если же werty не найдено, то утверждение верно, и с q все в порядке. Затем продолжается поиск любых символов, кроме пробела ([^\s]*).


Кванторы
Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:

a{10,20}

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

".*"

Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:

<a href="helloworld.htm" title="Привет, Мир">Привет, Мир</a>

Приведенный выше шаблон найдет в этой строке вот такую подстроку:

"helloworld.htm" title="Привет, Мир"

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

".*?"

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

"helloworld.htm" "Привет, Мир"


Примеры

[0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3} - ипишка
[0-9]{1,3}[\.]{3}[0-9]{1,3} - ипишка, в более короткой форме

http://website-lab.ru/article/regexp/shpargalka_po_regulyarnyim_vyirajeniyam/