Обычные Выражения. Все Проще, Чем Кажется

Добрый день всем.

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

Ну, давайте скорее к делу :)



Содержание

  1. Что такое обычная трава и с чем ее едят?
  2. Куда писать обычные письма?
  3. Простейшие регулярные узоры
  4. Кванторы
  5. Специальные символы квантификатора
  6. Специальные символы
  7. Просмотр вперед и назад (прямые и ретроспективные проверки)
  8. Регулярные выражения на разных языках программирования
  9. Заключение


Что такое обычная трава и с чем ее едят?

Проще говоря, регулярный — это шаблон, по которому фильтруется текст. Мы можем написать нужный нам шаблон (обычное письмо) и таким образом искать в тексте нужные нам символы, слова и т.д. Их также используют, например, при заполнении поля E-mail на различных сайтах, т.е.

создают шаблон типа: [email protected]. Это я взял для примера, не более того.

Теперь, разобравшись, что это такое, приступим к изучению.

Обещаю, скучно не будет)

Куда писать обычные письма?

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

Синтаксис (правила написания регулярных выражений) не привязан к какому-то конкретному языку программирования.

Поэтому, выучив регулярные выражения, вы сможете использовать их где угодно.

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

Я сразу дам вам ссылку на сайт, чтобы вы могли написать мне.

https://www.regextester.com/ Коротко о том, как пользоваться сайтом.

Выше, в столбце Регулярное выражение пишешь само регулярное выражение, а под ним, в столбце Тестовая строка вы пишете строку, которую хотите отфильтровать.

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



Простейшие регулярные узоры

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

Допустим, у нас есть строка какой-то текст. И допустим, мы хотим найти слово текст. Для этого нам просто нужно написать слово text в саму штатную систему и она его найдет.

Обычные выражения.
</p><p>
 Все проще, чем кажется

Пример регулярного шаблона На этом все, надеюсь, вы разбираетесь в регулярных выражениях, спасибо за внимание.

Шутка, конечно, но это еще не все.

Например, мы можем написать одну букву t и она найдет все ts в тексте.



Обычные выражения.
</p><p>
 Все проще, чем кажется

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

Теперь давайте сделаем это.



Кванторы

Я понимаю, что это звучит страшно, но на самом деле все просто.

Давайте разберемся сейчас.

С помощью кванторов мы можем указать, сколько раз следует повторить тот или иной символ (или группу символов).

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

  • {н} - символ повторяется ровно n раз
  • {м, н} - символ повторяется в диапазоне от m до n раз
  • {м,} - символ повторяется не менее m раз (от m и более)
Теперь давайте посмотрим на примеры.

Допустим, у нас есть строка ссс ссс ссссс.

И мы хотим подобрать слово, в котором буква s повторяется ровно 3 раза.

Для этого мы можем написать так: с{3} — то есть мы пишем символ s, тем самым говоря, что хотим его выбрать, и пишем рядом с ним {3}, говоря, что его следует повторить ровно 3 раза.

В результате будет найдено слово ссс

Обычные выражения.
</p><p>
 Все проще, чем кажется

Почему он взял еще один ссссс? Он взял его не целиком, а только часть, так как там тоже 3 буквы s подряд. Дело в том, что штатная система не будет учитывать, является ли это отдельным словом или нет. Пробелы также работают как символы! Следовательно, будет выбран любой фрагмент, соответствующий 3-м последовательным буквам s. Пойдем дальше, допустим, мы хотим выделить фрагмент, где символ s появится от одного до трех раз.

Для этого мы можем написать с{1,3} - снова указываем s и пишем {1,3}, говоря, что нам нужно, чтобы этот символ повторился от одного до трех раз.



Обычные выражения.
</p><p>
 Все проще, чем кажется

Оказывается интересный момент, он все выбрал.

Почему? Ответ: та же ситуация, что и в прошлый раз.

Увидел ссссс, взял 3 последовательных s вместе и еще один s, который находится рядом, потому что он тоже соответствует регулярной последовательности (а мы помним, что указывали диапазон от одного до трех раз) И, наконец, напишем шаблон, в котором символ s будет повторяться как минимум три раза.

Для этого напишем следующее: с{3,} ({3,} означает, что символ s будет повторяться три раза до бесконечности).



Обычные выражения.
</p><p>
 Все проще, чем кажется



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

Есть уже готовые кванторы, которые обозначены специальными.

символы.

Вот они:

  • ? ({0,1}) - символ повторяется 0 или 1 раз
  • * ({0,}) - символ повторяется 0 раз и более
  • + ({1,}) - символ повторяется 1 или более раз
Давайте разберемся.

Начнем со знака вопроса.

Допустим, у нас есть строка цвет цвет и мы хотим найти либо цвет, либо цвет. Мы можем написать так: цвет .



Обычные выражения.
</p><p>
 Все проще, чем кажется

Что случилось? Мы указали, что последовательность символов коло, затем написали u? (то же, что и {0,1}).

Это значит, что символ u повторяется 0 или 1 раз (т. е.

либо его нет вообще (он не повторяется, т. е.

повторяется 0 раз), либо он есть, но только один раз (он повторил один раз)).

Ну а потом указали, что после него должен идти символ r. Следовательно, цвет совпадает, поскольку буква u повторяется 1 раз, а цвет совпадает, поскольку буквы u вообще нет (повторяется 0 раз).

Видите, это просто :) Давайте изменим строку и напишем что-то вроде цвет .

Допустим, мы хотим указать, что вы должны либо не существовать, либо существовать столько раз, сколько пожелаем.

Для этого мы можем написать цвет.

Обычные выражения.
</p><p>
 Все проще, чем кажется

То есть либо тебя у нас нет, либо это повторяется много раз.

Символ + работает почти так же, за исключением того, что символ необходимо повторить хотя бы 1 раз.

То есть в данном случае слово цвет не будет совпадать, так как u там нет (то есть оно повторяется 0 раз, но в нашем случае символ должен повториться хотя бы 1 раз)

Обычные выражения.
</p><p>
 Все проще, чем кажется



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

Теперь поговорим о специальных символах, которые используются в регулярных выражениях.

Здесь все очень просто, так что особо волноваться не придется.

Не буду сюда везде прикреплять скрины (тогда статья разрастется до безумных размеров).

Поэтому прошу заранее понять и простить меня и попробовать самому.

  • .

    - одиночный персонаж

  • [] - набор символов, например [A-Z] обозначает все символы от А до Я
  • ^ - начало строки
  • $ - конец линии
  • \ - экранирование
  • - любой номер
  • - все, кроме цифр
  • - пробелы
  • - все, кроме пробелов
  • \ ш - письмо
  • - все, кроме букв
  • [^некоторыйсимвол] - отрицание символа, совпадающее со всеми символами, кроме выбранного
Давайте поговорим об одном персонаже.

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

Например, вернемся к нашей строке Немного текста и выберите букву t, за которой следует любой символ.

Для этого напишем т. е.

Будет выбран тэ , так как после t наступает один любой символ (в данном случае e)

Обычные выражения.
</p><p>
 Все проще, чем кажется

Давайте двигаться дальше.

Допустим, у нас есть строка Some text12345 и мы хотим выделить все буквы (только буквы, цифры нам не нужны).

Для этого мы можем написать следующее [А-Я, а-я] .

Что это значит? Это означает, что мы указали, что хотим выбрать все символы от A до Z (то есть мы выбираем все заглавные буквы), а затем, через запятую, говорим, что хотим выбрать все символы от a до z ( здесь мы выделяем все строчные буквы).



Обычные выражения.
</p><p>
 Все проще, чем кажется

Теперь давайте возьмем слово тест и выделить в нем первый буква т. Для этого мы можем написать ^ т .

То есть мы написали символ t и указали, что он должен быть в самом начале строки.

Важно поставить символ ^ перед нужным нам символом.



Обычные выражения.
</p><p>
 Все проще, чем кажется

Теперь поступим наоборот и возьмем последнюю букву т. Для этого напишем т$.

Важно, чтобы символ $ стоял после нужного нам символа.



Обычные выражения.
</p><p>
 Все проще, чем кажется

Перейдем к экранированию.

Звучит страшно, но на самом деле все просто как груши.

Например, в тексте какой-то текст. мы хотим выбрать точку.

Но точку мы уже зарезервировали как специальный символ (напоминаю, точка обозначает любой одиночный символ).

А для того, чтобы точка на считалась особенной.

мы можем написать символ \.

и тем самым говоря, что у нас будет точка как обычный символ.



Обычные выражения.
</p><p>
 Все проще, чем кажется

Теперь о простых вещах.

\d означает любое число.

Например, в тексте немного текста123 , если ты напишешь Будут выделены только цифры.

\D делает обратное: берутся все символы, кроме цифр.

То есть, если вы напишете Будет занято всё, кроме цифр (и пробелов, кстати, тоже).

принимает все пробелы в строке и — наоборот, всё, кроме пробелов.

\ ш берет письма и принимает все, кроме букв (включая пробелы).

Теперь я расскажу вам еще об одном использовании символа ^ .

Его можно использовать как отрицание, тем самым исключая символ или группу символов.

Например, в слове тест мы хотим выделить все, кроме буквы т и для этого мы можем написать так: [^т]

Обычные выражения.
</p><p>
 Все проще, чем кажется

Именно в этой последовательности символ ^ будет обозначать отрицание.



Просмотр вперед и назад (прямые и ретроспективные проверки)

Давайте разберемся, что это такое.

Смотреть вперед или форвардный чек позволяет выбрать символ или группу символов, если за ним следует какой-либо символ или группа символов.

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

  • смотреть вперед - предварительная проверка - Х(?=Y) - найти X, при условии, что после него идет Y
  • отрицательный форвардный чек - Х(?!Y)
  • смотреть за - ретроспективная проверка - (?<=Y)X - найти X, при условии, что перед ним стоит Y
  • негативный ретроспективный анализ - (?
Например, учитывая строку s SW SD ST SE и мы хотим выбрать букву s, за которой следует символ d. Для этого мы можем написать следующее: с(?=д) .

Таким образом мы проверяем, будет ли за символом s следовать символ d.

Обычные выражения.
</p><p>
 Все проще, чем кажется

Мы также можем сделать обратное и выбрать символ s, если после него НЕТ появляется символ d. Для этого вместо знака равенства необходимо поставить восклицательный знак ( ! ), т.е.

напишите так: s(?!d)

Обычные выражения.
</p><p>
 Все проще, чем кажется

Теперь поговорим о просмотре назад. Допустим, у нас есть строка s WS DS TS ES и мы хотим выбрать символ с , до которого будет стоять символ д .

Для этого мы можем написать так: (?<=d)s

Обычные выражения.
</p><p>
 Все проще, чем кажется

Почему просмотр назад подчеркнут красной линией? Дело в том, что просмотр назад не всегда поддерживается и такая штатная процедура не везде будет работать.

Нужно искать способ замены этого Lookbehind, но это зависит от поставленной задачи, поэтому нельзя точно сказать, как его заменить.

Будем надеяться, что скоро появится полная поддержка этой функции.

Чтобы сделать наоборот, то есть выбрать все символы s, до которых НЕТ пойдёт символ d, нужно снова поменять знак равенства на восклицательный: (?

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

Здесь я приведу примеры использования регулярных выражений в различных языках программирования.

Заранее скажу, что я не буду заострять внимание на синтаксисе языка программирования, так как к данной теме это уже не относится.

С#

  
  
   

string str = "some text"; Regex regex = new Regex(@"t$"); MatchCollection matches = regex.Matches(str);

Здесь мы создаем строку с текстом, который хотим проверить, создаем объект класса Regex и записываем в конструктор наше регулярное выражение (как я уже говорил, не буду заострять внимание на том, что такое объект класса и конструктор).

Затем мы создаем объект класса MatchCollection, вызываем метод Matches из объекта регулярного выражения и передаем нашу строку в параметры.

Это добавит все совпадения в коллекцию совпадений.

Джава

Pattern pattern = Pattern.compile("some text", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher("t$");

Здесь ситуация аналогичная.

Создаем объект класса Pattern и записываем нашу строку.

CASE_INSENSITIVE означает, что он нечувствителен к регистру (то есть нет разницы между символами верхнего и нижнего регистра).

Создаем объект класса Matcher и пишем туда регулярное выражение.

JavaScript

var regex = /d(b+)d/g; var matches = regex.exec("cdbbdbsbz");

Здесь тоже все просто.

Вы создаете объект регулярного выражения и записываете туда регулярное выражение.

А затем вы просто создаете объект совпадений, который будет коллекцией, вызываете метод exec и передаете строку в качестве параметров.



Заключение

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

Скажу сразу, написание правильных предложений приходит с опытом.

Практикуйтесь и я уверен, у вас все получится! И на этом я прощаюсь с тобой.

Спасибо за внимание и хорошего всем дня) P.S. Прошу не судить строго, это самая первая статья, которую я написал.

Любая критика приветствуется.

Теги: #регулярные выражения #регулярные выражения

Вместе с данным постом часто просматривают: