Шпаргалка по регулярным выражениям

Регулярные выражения – это шаблоны, используемые для сопоставления последовательностей символов в строках. В JavaScript регулярные выражения также являются объектами. Эти шаблоны используются в методах exec и test объекта RegExp, а также match, replace, search и split объекта String. Данная глава описывает регулярные выражения в JavaScript.

Регулярные выражения — исключить слово

Для того чтобы исключить слово из регулярного выражения, или набор слов, или даже целое предложение, используем конструкцию:
((?!word1|word2).)*

Пример: получить все последовательности символов такие, которые начинаются с begin, заканчиваются end и не содержат ни слова word1, ни слова word2:
begin((?!word1|word2).)*end

Спецсимволы

  Аналог Описание
()   подмаска, вложенное выражение
[]   групповой символ
{a,b}   количество вхождений от «a» до «b»
|   логическое «или», в случае с односимвольными альтернативами используйте []
  экранирование спец символа
.   любой сивол, кроме перевода строки
d [0-9] десятичная цифра
D [^d] любой символ, кроме десятичной цифры
f   конец (разрыв) страницы
n   перевод строки
pL   буква в кодировке UTF-8 при использовании модификатора u
r   возврат каретки
s [ tvrnf] пробельный символ
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 az aaa aaa
aaa aaa
конец текста
b ab
ba
aaa aaa
aaa aaa
граница слова, утверждение: предыдущий символ словесный, а следующий – нет, либо наоборот
B BaB aaa aaa отсутствие границы слова
G Ga aaa aaa Предыдущий успешный поиск, поиск остановился на 4-й позиции — там, где не нашлось a

Скачать в PDF, PNG.

Якоря

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

^[0-9]+

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

Символьные классы

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

ws

POSIX

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

Утверждения

Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, выбудете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документекаждое слово, включающее букву “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 не соответствует ничему, только экранирует все символы вплоть до E
E не соответствует ничему, только прекращает экранирование, начатое Q

Подстановка строк

Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть осуществовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотитеиспользовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.

Группы и диапазоны

Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать наборподходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F),следует использовать такой диапазон:

[A-Fa-f0-9]

Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кромецифр от 0 до 9 и букв от A до F:

[^A-Fa-f0-9]

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

Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:

(ab|bc)

Если в регулярном выражении необходимо сослаться на какую-то из предшествующих групп, следует использоватьn, где вместо nподставить номер нужной группы. Вам может понадобиться шаблон,соответствующий буквам «aaa» или «bbb», за которыми следует число, а затем те же три буквы. Такой шаблон реализуетсяс помощью групп:

(aaa|bbb)[0-9]+1

Первая часть шаблона ищет «aaa» или «bbb», объединяя найденные буквы в группу. За этим следует поиск одной или болеецифр ([0-9]+), и наконец 1. Последняя часть шаблона ссылается на первую группу и ищет тоже самое. Она ищет совпадение с текстом, уже найденным первой частью шаблона, а не соответствующее ему. Такимобразом, «aaa123bbb» не будет удовлетворять вышеприведенному шаблону, так как 1будет искать «aaa»после числа.

Одним из наиболее полезных инструментов в регулярных выражениях является подстановка строк. При замене текста можносослаться на найденную группу, используя $n. Скажем, вы хотите выделить в тексте все слова «wish»жирным начертанием. Для этого вам следует использовать функцию замены по регулярному выражению, которая можетвыглядеть так:

replace(pattern, replacement, subject)

Первым параметром будет примерно такой шаблон (возможно вам понадобятся несколько дополнительных символов для этойконкретной функции):

([^A-Za-z0-9])(wish)([^A-Za-z0-9])

Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры.Тогда ваша подстановка может быть такой:

$1<b>$2</b>$3

Ею будет заменена вся найденная по шаблону строка. Мы начинаем замену с первого найденного символа (который не букваи не цифра), отмечая его $1. Без этого мы бы просто удалили этот символ из текста. То же касается концаподстановки ($3). В середину мы добавили HTML тег для жирного начертания (разумеется, вместо него выможете использовать CSS или <strong>), выделив им вторую группу, найденную по шаблону($2).

Модификаторы шаблонов

Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера.Например, модификатор iзаставляет парсер игнорировать регистры.

Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чащеиспользуется «/»), и выглядит все таким образом:

/pattern/

Модификаторы добавляются в конец этой строки, вот так:

/pattern/i

Мета-символы

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

(

Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка.Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4.Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child.Скачать в PDF, PNG.

  1. Регулярные выражения

Якоря — ^ и $

^Привет соответствует строке, начинающейся с Привет ->тестпока$ соответствует строке, заканчивающейся на пока^Привет пока$ точное совпадение (начинается и заканчивается как Привет пока)воробушки соответствует любой строке, в которой есть текст воробушки

/Быть или не быть/ugi ¶

Синтаксис регулярных выражений прост и логичен. Он разделяется на символ-разделитель (он идёт в начале и конце выражения, обычно это /), шаблон поиска и необязательные модификаторы.

Формальный синтаксис такой:

[разделитель][шаблон][разделитель][модификаторы]

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

Давайте разберём выражение /Быть или не быть/ugi:

/ – начальный символ-разделительБыть или не быть – шаблон поиска/ – конечный символ-разделительugi – модификаторы (UTF-8, global, case insensitive)

Данное регулярное выражение будет искать текст Быть или не быть не зависимо от регистра по всему тексту неограниченное количество раз. Модификатор u нужен для того, чтобы явно указать, что текст у нас в юникоде, то есть содержит символы, отличные от латиницы. Модификатор i включает регистронезависимый поиск. Модификатор g указывает поисковику идти до победного конца, иначе он остановится после первого удачного совпадения.

Решение

Вы можете использовать это отрицательное регулярное выражение:

b(?!log(?:in)?|test)w+

RegEx Demo

(?!log(?:in)?|test) является негативным взглядом, который провалит совпадение, если какие-либо слова log,login,test присутствуют.

3

PHP-МАСТЕР.
От теории до собственной CMS интернет-магазина
 

php.jpg

Подробнее

Бесплатный курс по PHP программированию


Подробнее

Квантификаторы — * + ? и {}

abc* соответствует строке, в которой после ab следует 0 или более символов c ->тестabc+ соответствует строке, в которой после ab следует один или более символов cabc? соответствует строке, в которой после ab следует 0 или один символ cabc{2} соответствует строке, в которой после ab следует 2 символа cabc{2,} соответствует строке, в которой после ab следует 2 или более символов cabc{2,5} соответствует строке, в которой после ab следует от 2 до 5 символов ca(bc)* соответствует строке, в которой после ab следует 0 или более последовательностейсимволов bca(bc){2,5} соответствует строке, в которой после ab следует от 2 до 5 последовательностейсимволов bc

Закрепление

/hey/

сработает независимо от того где находится hey внутри строки.

Если вы хотите найти строки, которые начинаются с hey, то используйте оператор ^:

/^hey/.test(‘hey’) // ✅/^hey/.test(‘bla hey’) // ❌

Если вы хотите найти строки, которые заканчиваются на hey, то используйте оператор $:

/hey$/.test(‘hey’) // ✅/hey$/.test(‘bla hey’) // ✅/hey$/.test(‘hey you’) // ❌

Объединяя два предыдущих оператора вы можете найти строку, которая полностью совпадает с hey:

/^hey$/.test(‘hey’) // ✅

Чтобы найти строку начинающуюся с одной подстроки, а заканчивающуюся другой подстрокой вы можете использовать .*, который будет совпадать с любым символом повторяющимся 0 или более раз:

/^hey.*joe$/.test(‘hey joe’) // ✅/^hey.*joe$/.test(‘heyjoe’) // ✅/^hey.*joe$/.test(‘hey how are you joe’) // ✅/^hey.*joe$/.test(‘hey joe!’) // ❌

Флаги

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

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

  • g (global) ― не возвращает результат после первого совпадения, а продолжает поиск с конца предыдущего совпадения.
  • m (multi line) ― с таким флагом, операторы ^ и $ вызовут совпадение в начале и конце строки ввода (line), вместо строки целиком (string).
  • i (insensitive) ― делает выражение регистронезависимым (например, /aBc/i соответствует AbC).

Скобочные группы ― ()

a(bc) создаём группусо значением bc ->тестa(?:bc)* оперетор ?: отключает группу ->тестa(?<foo>bc) так, мы можем присвоить имя группе -> тест

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

Если присвоить группам имена (используя (?<foo>…)), то можно получить их значения, используя результат сопоставления, как словарь, где ключами будут имена каждой группы.

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

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

  • /
  • [ ]
  • ( )
  • { }
  • ?
  • +
  • *
  • |
  • .
  • ^
  • $

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

/^\$//^^$/ // /^^$/.test(‘^’) ✅/^$$/ // /^$$/.test(‘$’) ✅

Замена с помощью регулярных выражений

Мы уже видели как нужно проверять строки на совпадение с шаблоном.

Также мы видели как можно извлекать часть строк соотвествующие шаблону в массив.

Теперь давайте рассмотрим как заменять части строки на основе шаблона.

У объекта String в JavaScript есть метод replace(), который можно использовать без регулярных выражений для одной замены в строке:

“Hello world!”.replace(‘world’, ‘dog’) //Hello dog!”My dog is a good dog!”.replace(‘dog’, ‘cat’) //My cat is a good dog!

 Этот метод также может принимать и регулярное выражение в качестве аргумента:

“Hello world!”.replace(/world/, ‘dog’) //Hello dog!

Использование флага g – это единственный способ заменить несколько вхождений в строке на ванильном JavaScript:

“My dog is a good dog!”.replace(/dog/g, ‘cat’) //My cat is a good cat!

Группы позволяют нам делать больше причудливых вещей, менять местами части строк:

“Hello, world!”.replace(/(w+), (w+)!/, ‘$2: $1!!!’)// “world: Hello!!!”

Вместо строки можно использовать функцию, чтобы делать ещё более интересные вещи. В неё будет передан ряд аргументов, таких как возвращают методы String.match(RegExp) или RegExp.exec(String), где количество аргументов зависит от количества групп:

“Hello, world!”.replace(/(w+), (w+)!/, (matchedString, first, second) => { console.log(first); console.log(second); return `${second.toUpperCase()}: ${first}!!!`})//”WORLD: Hello!!!”

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...