Регулярные выражения — различия между версиями
Root (обсуждение | вклад) |
Root (обсуждение | вклад) |
||
Строка 45: | Строка 45: | ||
| {a,b} || || количество вхождений от "a" до "b" | | {a,b} || || количество вхождений от "a" до "b" | ||
|- | |- | ||
− | | | + | | <nowiki>|</nowiki> || || логическое "или", в случае с односимвольными альтернативами используйте [] |
|- | |- | ||
| \ || || экранирование спец символа | | \ || || экранирование спец символа | ||
Строка 112: | Строка 112: | ||
Якоря в регулярных выражениях указывают на начало или конец чего-либо. Например, строки или слова. Они представлены определенными символами. К примеру, шаблон, соответствующий строке, начинающейся с цифры, должен иметь следующий вид: | Якоря в регулярных выражениях указывают на начало или конец чего-либо. Например, строки или слова. Они представлены определенными символами. К примеру, шаблон, соответствующий строке, начинающейся с цифры, должен иметь следующий вид: | ||
^[0-9]+ | ^[0-9]+ | ||
− | Здесь символ ^обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру. | + | Здесь символ <font color=blue>^</font> обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру. |
Строка 121: | Строка 121: | ||
'''Утверждения'''<br/> | '''Утверждения'''<br/> | ||
− | Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву | + | Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву "q", за которой не следует "werty". |
[^\s]*q(?!werty)[^\s]* | [^\s]*q(?!werty)[^\s]* | ||
Приведенный выше код начинается с поиска любых символов, кроме пробела (<font color=blue>[^\s]*</font>), за которыми следует <font color=blue>q</font>. Затем парсер достигает «смотрящего вперед» утверждения. Это автоматически делает предшествующий элемент (символ, группу или символьный класс) условным — он будет соответствовать шаблону, только если утверждение верно. В нашем случае, утверждение является отрицательным (<font color=blue>?!</font>), т. е. оно будет верным, если то, что в нем ищется, не будет найдено. | Приведенный выше код начинается с поиска любых символов, кроме пробела (<font color=blue>[^\s]*</font>), за которыми следует <font color=blue>q</font>. Затем парсер достигает «смотрящего вперед» утверждения. Это автоматически делает предшествующий элемент (символ, группу или символьный класс) условным — он будет соответствовать шаблону, только если утверждение верно. В нашем случае, утверждение является отрицательным (<font color=blue>?!</font>), т. е. оно будет верным, если то, что в нем ищется, не будет найдено. | ||
Строка 129: | Строка 129: | ||
'''Кванторы'''<br/> | '''Кванторы'''<br/> | ||
− | Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв | + | Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв "a", то можно использовать этот шаблон: |
a{10,20} | a{10,20} | ||
− | По умолчанию кванторы — «жадные». Поэтому квантор <font color=blue>+</font> | + | По умолчанию кванторы — «жадные». Поэтому квантор <font color=blue>+</font>, означающий "один или больше раз", будет соответствовать максимально возможному значению. Иногда это вызывает проблемы, и тогда вы можете сказать квантору перестать быть жадным (стать «ленивым»), используя специальный модификатор. Посмотрите на этот код: |
".*" | ".*" | ||
Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой: | Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой: | ||
− | + | <font color=blue><a href="helloworld.htm" title="Привет, Мир">Привет, Мир</a></font> | |
− | <a href="helloworld.htm" title="Привет, Мир">Привет, Мир</a> | ||
− | |||
Приведенный выше шаблон найдет в этой строке вот такую подстроку: | Приведенный выше шаблон найдет в этой строке вот такую подстроку: | ||
− | "helloworld.htm" title="Привет, Мир" | + | <font color=blue>"helloworld.htm" title="Привет, Мир"</font> |
Он оказался слишком жадным, захватив наибольший кусок текста, который смог. | Он оказался слишком жадным, захватив наибольший кусок текста, который смог. | ||
".*?" | ".*?" | ||
− | Этот шаблон также соответствует любым символам, заключенным в двойные кавычки. Но ленивая версия (обратите внимание на модификатор <font color=blue>?</font> | + | Этот шаблон также соответствует любым символам, заключенным в двойные кавычки. Но ленивая версия (обратите внимание на модификатор <font color=blue>?</font>) ищет наименьшее из возможных вхождений, и поэтому найдет каждую подстроку в двойных кавычках по отдельности: |
− | "helloworld.htm" "Привет, Мир" | + | <font color=blue>"helloworld.htm" "Привет, Мир"</font> |
+ | |||
+ | |||
+ | '''Экранирование в регулярных выражениях'''<br/> | ||
+ | Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникает проблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярном выражении обозначает "любой символ, кроме переноса строки". Если вам нужно найти точку в строке, вы не можете просто использовать "<font color=blue>.</font>" в качестве шаблона — это приведет к нахождению практически всего. Итак, вам необходимо сообщить парсеру, что эта точка должна считаться обычной точкой, а не "любым символом". Это делается с помощью знака экранирования. | ||
+ | |||
+ | Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. | ||
+ | Шаблон для нахождения точки таков: | ||
+ | \. | ||
+ | Другие специальные символы в регулярных выражениях соответствуют необычным элементам в тексте. Переносы строки и табуляции, к примеру, могут быть набраны с клавиатуры, но вероятно собьют с толку языки программирования. Знак экранирования используется здесь для того, чтобы сообщить парсеру о необходимости считать следующий символ специальным, а не обычной буквой или цифрой. | ||
+ | |||
+ | |||
+ | '''Спецсимволы экранирования в регулярных выражениях''' | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Выражение !! Соответствие | ||
+ | |- | ||
+ | | \ || не соответствует ничему, только экранирует следующий за ним символ. Это нужно, если надо ввести метасимволы <font color=blue><nowiki>!</nowiki>$()*+.<>?[\]^{<nowiki>|</nowiki>}</font> в качестве их буквальных значений. | ||
+ | |- | ||
+ | | \Q || не соответствует ничему, только экранирует все символы вплоть до <font color=blue>\Q</font> | ||
+ | |- | ||
+ | | \E || не соответствует ничему, только прекращает экранирование, начатое <font color=blue>\E</font> | ||
+ | |} | ||
Версия 11:27, 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" "Привет, Мир"
Экранирование в регулярных выражениях
Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникает проблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярном выражении обозначает "любой символ, кроме переноса строки". Если вам нужно найти точку в строке, вы не можете просто использовать "." в качестве шаблона — это приведет к нахождению практически всего. Итак, вам необходимо сообщить парсеру, что эта точка должна считаться обычной точкой, а не "любым символом". Это делается с помощью знака экранирования.
Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Шаблон для нахождения точки таков:
\.
Другие специальные символы в регулярных выражениях соответствуют необычным элементам в тексте. Переносы строки и табуляции, к примеру, могут быть набраны с клавиатуры, но вероятно собьют с толку языки программирования. Знак экранирования используется здесь для того, чтобы сообщить парсеру о необходимости считать следующий символ специальным, а не обычной буквой или цифрой.
Спецсимволы экранирования в регулярных выражениях
Выражение | Соответствие |
---|---|
\ | не соответствует ничему, только экранирует следующий за ним символ. Это нужно, если надо ввести метасимволы !$()*+.<>?[\]^{|} в качестве их буквальных значений. |
\Q | не соответствует ничему, только экранирует все символы вплоть до \Q |
\E | не соответствует ничему, только прекращает экранирование, начатое \E |
Примеры
[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/