суббота, 17 июня 2017 г.

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

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


   
    Сервис: http://regexr.com/
    Если убрать флаг global, то найдется только первое совпадение и поиск прекратится.
    Если поставим флаг ignore case, то включим регистронезависимый поиск.
    В JS поддерживается флаг multiline. Он имеет смысл только для пределенного набора символов.
   
    Мы можем увидеть, как будет выглядеть литерал регулярного выражения в JS: /that/ig
    Литералы регулярных выражений выделяются слешами.
    После закрывающего слеша могут быть прописаны флаги.
    При помощи квадраных скобок [] мы можем объединять символы в классы.
    [aoeiuy] - так мы найдем все глассные в тексте.
    Также поддерживаются диапазоны, для определения которых используется дифис.
   
    Такой шаблон [A-Z] найдет все заглавные буквы в тексте. Сюда можно добавить все строчные буквы [a-zA-Z]
    Здесь могуть быть все строчные буквы от a до e - [a-e]
    Также мы можем указать диапазоны цифр [0-6]
   
    Так ищется все, что не входит в этот класс [^0-9], т.е символы, которых нет внутри [].
   
    Существуют удобные сокращения:
    \d = [0-9], т.е цифры
    \D - любой символ, кроме цифр.
    \w - найдет все символы, которы являются буквами или цифрами.
    \W - все символы, которы не являются буквами или цифрами. Пробелы, точки, запятые, дифисы.
    \s - находит все пустые символы (пробелы, табуляции и переносы строк).
    \S - находит все, что не является пустыми символами.
   
    \b - граница слова.
    Если мы напишем an, то найдем все слова, например anything.
    \ban\b - найдем только артикли an.
    \Ban\B - находит an только в середине слова. Например, want
   
    Используем лоическое или |
    \Ban|an\B - ищем an, с которого не начинается слово, либо an, которым не заканчиватся слово. Например, want
   
    Найдем слова me и and \bme\b|\band\b
   
    Например, нам нужно найти слова gray и grey. Пишем grey|gray или gr(e|a)y или gr[ae]y
   
    Найдем оба слова center и centre: cent(er|re)
   
    Найдем color и colour: colou?r
    ? - означает, что символ u необязателен.
   
    . точка выделяет любой символ, кроме переноса строк.
    Если нужно найти символ . мы должные экранировать ее обратным слешем: \.
   
    Синтаксис для повторений.
    Например, мы хотим найти слово, которое начинается с а и кончается е
    Можна написать так a....e Например, будет найдено слово happened
    Но можно избежать повторений: a.{4}e
    Запись вида a.{2,6}e означает, что символ повторятся от 2 до 6 раз.
   
    Повторения могут быть жадными и нежадными. По умолчанию все посторения жадные.
    Сделать посторение нежадным можно знаком вопроса: a.{2,6}?e
    Нежадное означает, что после буквы идет наименьшее кол-во символов.
    Жадное означает, что после буквы идет настолько большое кол-во символов, насколько это возможно.
    Повторение от 1 и более раз записыватеся так: a.{1,}?e
   
    Повторение от 1 и более раз можно записать сокращенно: a.+?e
    Повторение от 0 и более раз можно записать сокращенно: a.*?e
   
    МЕТАСИМВОЛЫ
    Например, \b, ^, $
    Найдем точки в середине строк: \.$
   
    Вперед смотрящее утверждение и вперед смотрящее отрицание.
    Например, найдем and после которого есть слово he: and(?= he) При этом мэтчится слово and, что удобно.
   
    Найдем все слова, после которых идет and: \b\w+?\b(?=[\s.]*?and)
   
    Найдем все слова to, после которых нет слова know: \bto\b(?! know)
   
    Lookbehind, т.е назад смотрящее утверждение, которая проверяет есть ли что-то перед строкой. Но в JS такого нет.
   
    ГРУППЫ.
    Найдем мейлы и вытащим из них имена яшиков и домены: \b\w+@\w+\.\w+\b
   (\b\w+)@(\w+\.\w+\b)
   Первая группа - все до символа @ и вторая все, что идет после него.
 
   Например, в тексте есть слова java и javascript и мы хотим найти оба слова:
   java(script)?
   ? означает, что это необязательная часть
   ? эквивалентен {0,1} - повторение от 0 до 1 раза
   Чтобы не было запоминающей группы, напишем так: java(?:script)?
 
   Сервис, который визуализирует регулярные варажения: https://regexper.com/
   Регулярное выражение для url: (?:(\w+):\/\/)?([^/]+)(.+)?

Комментариев нет:

Отправить комментарий