admin / 19.03.2018
Регулярные выражения
Регулярные выражения ("регэкспы", от англ. Regular Expressions) — мощное средство составления шаблонов, с помощью которых в заданном тексте может проводиться поиск и сопоставление символов любой сложности.
Как составляется такой шаблон? Для этого используются специальные символы, метасимволы и классы (наборы) символов. Регулярное выражение — это простая строка и любые символы в этой строке, которые не являются специальными (зарезервированными), считаются обычными символами.
Служебные символы делятся на три класса:
Любое выражение можно сгруппировать (заключить в скобки) и применить оператор ко всей группе.
Синтаксис регулярных выражений, использующийся в nnCron, совпадает с синтаксисом регулярных выражений языка Perl. Небольшие отличия есть только в некоторых расширенных специфических операторах.
Синтаксис
Все регэкспы должны заключаться в прямые слэши (/…/). После конечного слэша могут идти параметры:
/…/i | — не различать регистр. |
/…/x | — игнорировать пробелы и переводы строк (для удобства). |
/…/s | — считать регэксп одной единственной строкой (трактовать спецсимвол . (точка) как "любой символ, в том числе и символ перевода строки"). |
Примеры:
\ совпадет только со словом ‘Valery’ /Valery/ \ совпадет со словами ‘VALERY’, ‘valery’, ‘Valery’ и т. д. /Valery/i \ совпадет с ‘foobar’, ‘foobar barfoo’ /foobar/ \ совпадет с ‘foobar’, ‘FOOBAR’, ‘foobar and two other foos’ / FOO bar /ix \ совпадет с ‘Valery%crlf%Kondakoff’ /Valery.*Kondakoff/s
Каждый символ регулярного выражения последовательно сравнивается с проверяемой строкой. Все, что не является указанными ниже спецсимволами или операторами, воспринимается, как обычный символ, рассматриваемый на простое совпадение.
Спецсимволы
^ | Начало строки |
$ | Конец строки |
. | Любой символ кроме переводов строки (без параметра /…/s) |
[ … ] |
Любой из перечисленного набора символов. Внутри квадратных скобок не работают другие операторы, но можно пользоваться метасимволами. |
[^ … ] | Ни один из перечисленного набора символов. Внутри квадратных скобок не работают другие операторы, но можно пользоваться метасимволами. С помощью дефиса можно указывать наборы символов: от первого до последнего. Например, [^0-9] означает любой символы, кроме0, 1, 2, 3, 4, 5, 6, 7, 8, 9. |
\# |
Следующий за слэшем символ # (кроме a-z и 0-9). |
\b | Начало слова |
\B | Конец слова |
\xNN | NN — шестнадцатеричный код ASCII-символа (\x20 — пробел, \x4A — J, \x6A — j и т. д.) |
\n | 0x10 (lf) |
\r | 0x13 (cr) |
\t | 0x09 (tab) |
\s | Пробел (tab/space/cr/lf) |
\S | Не пробел |
\w | Символ слова (буквы, цифры, _) |
\W | Символ не-слова |
\d | Число |
\D | Не число |
\u | Символ в верхнем регистре |
\l | В нижнем |
Примеры:
\ совпадает со словом ‘help’ с точкой /help\./ \ совпадает со словами ‘cats’, ‘cars’ и т. д. /ca.s/ \ совпадает со словами ‘testing’, ‘tester’, но не ‘the test’ /^test/ \ совпадает с выражением ‘see me’, но не с ‘meter’ или ‘me and you’ /me$/ \ совпадает с одной (латинской) гласной буквой /[aeiou]/ \ совпадает с одной буквой или цифрой /[a-z0-9]/
\ совпадает с ‘footer’, ‘footing’, ‘a foot’, но не с ‘afoot’ /\bfoot/ \ совпадает с ‘afoot’, ‘foot.’ (точка не считается частью слова) \ не совпадает с ‘footing’ /foot\B/ \ совпадает со словом ‘foot’ целиком /\bfoot\B/ \ совпадает со словами ‘q2w’, ‘r5t’ и т. д. /\D\d\D/
Расширенные спецсимволы
В отличии от обычных символов эти классы не совместимы с перловыми:
\N | Ссылка внутри регэкспа на его же разобранную скобку, число N — номер нужной группы (скобки). Этот оператор работает с некоторыми ограничениями на тип ссылаемого блока — он работает, только если в ссылаемой скобке нет операторов повторения. |
Пример:
\ совпадает с фразами ‘man to man’, ‘ \ hand to hand’, ‘100 to 100’ и т. д. (\b\w+\B) to \1
Операторы
Операторы не могут применяться сами по себе, без указания символа, на который они действуют. Оператор действует на определенный перед ним символ (мета или обычный). Если какое-то выражение заключено в скобки, после которых стоит оператор, то он действует на всю скобку.
( … ) | Сгруппировать символы в один паттерн и запомнить |
| | Предыдущий или следующий паттерн (логическое "ИЛИ") |
* | Ноль или больше раз |
+ | Один или больше раз |
? | 0 или 1 раз предыдущая маска |
{n} | Повторять n раз |
{n,} | Повторять n или больше раз |
{n,m} | Повторять от n до m раз |
Примеры:
\ совпадает со словами ‘cat’ или ‘mouse’ /(cat)|(mouse)/ \ совпадает со словами ‘dogs’, ‘doggie’ /dog(s|gie)/ \ совпадает с ‘ma’, ‘maaa’, ‘maaaaaaa’ /ma+/ \ совпадает с ‘m’, ‘maaa’ /ma*/ \ совпадает с ‘yada yada yada’ /(yada ){2,}/ \ совпадает с ‘fooandbar’, ‘foobar’ /foo(and)?bar/
Если после оператора добавить ?, то он превращается из жадного в нежадный. К примеру жадный * будет нежадным после замены его на *?. Жадные операторы производят максимальный захват в строке, а нежадные захватывают по минимуму.
Расширенные операторы
?#N | Это оператор "просмотра назад". N — число символов для просмотра. |
?~N | Отрицание просмотра назад. |
?= | Просмотр вперед. |
?! | Отрицание просмотра вперед. |
Заметьте, что хотя последние два оператора существуют и в перле, в нем они записываются в виде (?=foobar). В nnCron оператор выглядит как (foobar)?=.
Примеры:
\ совпадет с любым словом, после которого знак табуляции \ при этом сам знак табуляции не войдет в число совпавших символов /\w+(\t)?=/ \ совпадет с любым появлением ‘foo’, которое не продолжается ‘bar’ /foo(bar)?!/ \ совпадет с любым появлением ‘bar’, которому предшествует ‘foo’ /(foo)?#3bar/
Еще немного примеров:
\ совпадет с «foobar», «bar» /(foo)?bar/ \ совпадет _только_ с «foobar» /^foobar$/ \ совпадет с «foobar», «for», «far» /f[obar]+r/ \ задает любое число с десятичной запятой /([\d\.])+/ \ совпадет с «foofoofoobarfoobar», «bar» /((foo)|(bar))+/
Содержание
Последнее обновление: 1.11.2015
Рассмотрим базовые моменты синтаксиса регулярных выражений.
Регулярные выражения также могут использовать метасимволы — символы, которые имеют определенный смысл:
: соответствует любой цифре от 0 до 9
: соответствует любому символу, который не является цифрой
: соответствует любой букве, цифре или символу подчеркивания (диапазоны A–Z, a–z, 0–9)
: соответствует любому символу, который не является буквой, цифрой или символом подчеркивания (то есть не находится в следующих диапазонах A–Z, a–z, 0–9)
: соответствует пробелу
: соответствует любому символу, который не является пробелом
: соответствует любому символу
Здесь надо заметить, что метасимвол \w применяется только для букв латинского алфавита, кириллические символы для него не подходят.
Так, стандартный формат номера телефона соответствует регулярному выражению .
Например, заменим числа номера нулями:
var phoneNumber = «+1-234-567-8901»; var myExp = /\d-\d\d\d-\d\d\d-\d\d\d\d/; phoneNumber = phoneNumber.replace(myExp, «00000000000»); document.write(phoneNumber);
Кроме выше рассмотренных элементов регулярных выражений есть еще одна группа комбинаций, которая указывает, как символы в строке будут повторяться. Такие комбинации еще называют модификаторами:
: соответствует n-ому количеству повторений предыдущего символа. Например, соответствует подстроке «hhh»
: соответствует n и более количеству повторений предыдущего символа. Например, соответствует подстрокам «hhh», «hhhh», «hhhhh» и т.д.
: соответствует от n до m повторений предыдущего символа. Например, соответствует подстрокам «hh», «hhh», «hhhh».
: соответствует одному вхождению предыдущего символа в подстроку или его отсутствию в подстроке. Например, соответствует подстрокам «home» и «ome».
: соответствует одному и более повторений предыдущего символа
: соответствует любому количеству повторений или отсутствию предыдущего символа
: соответствует началу строки.
Например, соответствует строке «home», но не «ohma», так как h должен представлять начало строки
: соответствует концу строки. Например, соответствует строке «дом», так как строка должна оканчиваться на букву м
Например, возьмем номер тот же телефона. Ему соответствует регулярное выражение . Однако с помощью выше рассмотренных комбинаций мы его можем упростить:
Также надо отметить, что так как символы ?, +, * имеют особый смысл в регулярных выражениях, то чтобы их использовать в обычным для них значении (например, нам надо заменить знак плюс в строке на минус), то данные символы надо экранировать с помощью слеша:
var phoneNumber = «+1-234-567-8901»; var myExp = /\+\d-\d{3}-\d{3}-\d{4}/; phoneNumber = phoneNumber.replace(myExp, «80000000000»); document.write(phoneNumber);
Отдельно рассмотрим применение комбинации ‘\b’, которая указывает на соответствие в пределах слова. Например, у нас есть следующая строка: «Языки обучения: Java, JavaScript, C++». Со временем мы решили, что Java надо заменить на C#. Но простая замена приведет также к замене строки «JavaScript» на «C#Script», что недопустимо. И в этом случае мы можем проводить замену, если регуляное выражение соответствует всему слову:
var initialText = «Языки обучения: Java, JavaScript, C++»; var exp = /Java\b/g; var result = initialText.replace(exp, «C#»); document.write(result); // Языки обучения: C#, JavaScript, C++
Но при использовании ‘\b’ надо учитывать, что в JavaScript отсутствует полноценная поддержка юникода, поэтому применять ‘\b’ мы сможем только к англоязычным словам.
Для поиска в строке более сложных соответствий применяются группы. В регулярных выражениях группы заключаются в скобки. Например, у нас есть следующий код html, который содержит тег изображения: ‘<img src=»https://steptosleep.ru/wp-content/uploads/2018/06/47616.png» />’. И допустим, нам надо вычленить из этого кода пути к изображениям:
var initialText = ‘<img src= «picture.png» />’; var exp = /[a-z]+\.(png|jpg)/i; var result = initialText.match(exp); result.forEach(function(value, index, array){ document.write(value + «<br/>»); })
Вывод браузера:
picture.png png
Первая часть до скобок ([a-z]+\.) указывает на наличие в строке от 1 и более символов из диапазона a-z, после которых идет точка. Так как точка является специальным символом в регулярных выражениях, то она экранируется слешем. А дальше идет группа: . Эта группа указывает, что после точки может использоваться как «png», так и «jpg».
НазадСодержаниеВперед
Аналог | Пример | Описание | |
---|---|---|---|
? | {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 |
Скачать в PDF, PNG.
Якоря в регулярных выражениях указывают на начало или конец чего-либо.
Например, строки или слова. Они представлены определенными символами. К примеру, шаблон, соответствующий строке, начинающейся с цифры, должен иметь следующий вид:
Здесь символ обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.
Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, соответствует любой цифре от 0 до 9 включительно, соответствует буквам и цифрам, а— всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядиттак:
POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьнымиклассами, заключается в использовании сокращений, представляющих некоторую группу символов.
Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, выбудете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документекаждое слово, включающее букву “q”, за которой не следует “werty”».
Приведенный выше код начинается с поиска любых символов, кроме пробела (), за которыми следует. Затем парсер достигает «смотрящего вперед» утверждения. Это автоматически делает предшествующийэлемент (символ, группу или символьный класс) условным — он будет соответствовать шаблону, только еслиутверждение верно. В нашем случае, утверждение является отрицательным (), т. е. оно будет верным,если то, что в нем ищется, не будет найдено.
Итак, парсер проверяет несколько следующих символов по предложенному шаблону (). Если они найдены,то утверждение ложно, а значит символ будет «проигнорирован», т. е. не будет соответствовать шаблону.Если же не найдено, то утверждение верно, и с все в порядке. Затем продолжаетсяпоиск любых символов, кроме пробела ().
Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если выхотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этотшаблон:
По умолчанию кванторы — «жадные». Поэтому квантор , означающий «один или больше раз», будетсоответствовать максимально возможному значению. Иногда это вызывает проблемы, и тогда вы можете сказать кванторуперестать быть жадным (стать «ленивым»), используя специальный модификатор. Посмотрите на этот код:
Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вродеэтой:
Приведенный выше шаблон найдет в этой строке вот такую подстроку:
Он оказался слишком жадным, захватив наибольший кусок текста, который смог.
Этот шаблон также соответствует любым символам, заключенным в двойные кавычки. Но ленивая версия (обратите вниманиена модификатор ) ищет наименьшее из возможных вхождений, и поэтому найдет каждую подстроку в двойныхкавычках по отдельности:
Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникаетпроблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярномвыражении обозначает «любой символ, кроме переноса строки». Если вам нужно найти точку в строке, вы не можете простоиспользовать «» в качестве шаблона — это приведет к нахождению практически всего. Итак, вамнеобходимо сообщить парсеру, что эта точка должна считаться обычной точкой, а не «любым символом». Это делается спомощью знака экранирования.
Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычнымсимволом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Вы можете найтиих в правом нижнем углу шпаргалки («Мета-символы»).
Шаблон для нахождения точки таков:
Другие специальные символы в регулярных выражениях соответствуют необычным элементам в тексте. Переносы строки итабуляции, к примеру, могут быть набраны с клавиатуры, но вероятно собьют с толку языки программирования. Знакэкранирования используется здесь для того, чтобы сообщить парсеру о необходимости считать следующий символспециальным, а не обычной буквой или цифрой.
Выражение | Соответствие |
---|---|
\ | не соответствует ничему, только экранирует следующий за ним символ.
Это нужно, если вы хотите ввести метасимволы в качестве их буквальных значений. |
\Q | не соответствует ничему, только экранирует все символы вплоть до |
\E | не соответствует ничему, только прекращает экранирование, начатое |
Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть осуществовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотитеиспользовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.
Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать наборподходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F),следует использовать такой диапазон:
Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кромецифр от 0 до 9 и букв от A до F:
Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблонаиз другой его части; а также при подстановке строк.
Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:
Если в регулярном выражении необходимо сослаться на какую-то из предшествующих групп, следует использовать, где вместо подставить номер нужной группы. Вам может понадобиться шаблон,соответствующий буквам «aaa» или «bbb», за которыми следует число, а затем те же три буквы. Такой шаблон реализуетсяс помощью групп:
Первая часть шаблона ищет «aaa» или «bbb», объединяя найденные буквы в группу. За этим следует поиск одной или болеецифр (), и наконец . Последняя часть шаблона ссылается на первую группу и ищет тоже самое. Она ищет совпадение с текстом, уже найденным первой частью шаблона, а не соответствующее ему. Такимобразом, «aaa123bbb» не будет удовлетворять вышеприведенному шаблону, так как будет искать «aaa»после числа.
Одним из наиболее полезных инструментов в регулярных выражениях является подстановка строк. При замене текста можносослаться на найденную группу, используя . Скажем, вы хотите выделить в тексте все слова «wish»жирным начертанием. Для этого вам следует использовать функцию замены по регулярному выражению, которая можетвыглядеть так:
Первым параметром будет примерно такой шаблон (возможно вам понадобятся несколько дополнительных символов для этойконкретной функции):
Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры.Тогда ваша подстановка может быть такой:
Ею будет заменена вся найденная по шаблону строка. Мы начинаем замену с первого найденного символа (который не букваи не цифра), отмечая его . Без этого мы бы просто удалили этот символ из текста. То же касается концаподстановки (). В середину мы добавили HTML тег для жирного начертания (разумеется, вместо него выможете использовать CSS или ), выделив им вторую группу, найденную по шаблону().
Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера.Например, модификатор заставляет парсер игнорировать регистры.
Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чащеиспользуется «/»), и выглядит все таким образом:
Модификаторы добавляются в конец этой строки, вот так:
Наконец, последняя часть таблицы содержит мета-символы. Это символы, имеющие специальное значение в регулярныхвыражениях. Так что если вы хотите использовать один из них как обычный символ, то его необходимо экранировать. Дляпроверки наличия скобки в тексте, используется такой шаблон:
Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка.Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4.Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child.Скачать в PDF, PNG.
По-умолчанию в PHP функции для работы с регулярными выражениями некорректно работают кириллицей и с русскими буквами в частности. Обычно такое поведение заключается в выборке не всех сиволов из поисковой маски.
Для работы с ними нужно использовать модификатор поисковой маски, который указывает на поиск unicode.
u (PCRE_UTF8)
Этот модификатор включает дополнительную функциональность PCRE, которая не совместима с Perl: шаблон и целевая строка обрабатываются как UTF-8 строки. Модификатор u доступен в PHP 4.1.0 и выше для Unix-платформ, и в PHP 4.2.3 и выше для Windows платформ. Валидность UTF-8 в шаблоне и целевой строке проверяется начиная с PHP 4.3.5. Недопустимая целевая строка приводит к тому, что функции preg_* ничего не находят, а неправильный шаблон приводит к ошибке уровня E_WARNING. Пятый и шестой октеты UTF-8 последовательности рассматриваются недопустимыми с PHP 5.3.4 (согласно PCRE 7.3 2007-08-28); ранее они считались допустимыми.
Модификаторы шаблонов Perl-совместимых регулярных выражений (PCRE)
Регулярные выражения прочно вошли в жизнь разработчиков и частенько приходят на помощь в тех ситуациях, когда необходимо осуществить специфический поиск или подстановку. Многие текстовые редакторы, программы и утилиты поддерживают поиск по регулярным выражениям (TotalCommander, Notepad++ и пр.), чем значительно облегчают жизнь тем, кто ищет.
Зачастую составление регулярного выражения у многих (не только начинающих разработчиков) вызывает проблемы, и отъем приличного куска времени. Онлайн-сервис easyregexp.ru призван помочь коллегам по цеху (программистам всех мастей и народов) или просто желающим освоить регулярные выражения.
Итак, чем располагает наш сервис:
На странице конструктора справа от формы для тестирования расположен блок метасимволов, разбитый по категориям. При наведении на символ будет показана краткая информации о нем и пример использования.
Если у Вас возникают вопросы, предложения и пожелания, воспользуйтесь контактной формой для связи с администрацией сайта.
Категория: / DEV Блог / PHP (LAMP)
Требует, чтобы после текущей точки находился текст, соответствующий данному шаблону. Такая, конструкция обрабатывается как условие или мнимый символ, поскольку не включается В результат поиска. Например, поиск с помощью команды найдет слово, за которым следуют один или несколько «пробельных символов», однако сами они в результат не войдут.
Более подробно описан в документации perl.
В отличие от глобальных модификаторов, имеют силу только для текущего блока, то есть для ближайшей группы круглых скобок, охватывающих конструкцию, Например, шаблон соответcтвует слову «text» без учета регистра.
Пример «заглядывания»-lookahead
Анализируем лог апача на предмет рефереров
Необходимо выбрать все уникальные рефы из лога и положить в отдельный файл.
При этом учесть, что рефы с самого сайта и пустые («-«) нужно отбрасывать.
@author mihail
@date Вторник, 27 Март 2007
@views 20140
FILED UNDER : IT