Регулярные выражения
Цитата: admin от 11.12.2021, 12:25Основы регулярных выражений
Видео на YouTube
.Любой символ.
Хоть буква, хоть цифра, хоть точка, хоть пробел.\Это символ экранирования.
Нам вот нужно указать точку буквально, и поэтому мы пишем так:\.
И таким\мы можем экранировать любые спецсимволы.*Повторяется от 0 до бесконечности раз.
Например, regex.*означает любой символ или символы, которые могут повторяться сколько угодно раз.
А может их вообще не будет ни одного, потому что*– это от 0 до бесконечности.
Например, regex\.*означает, что символ точки может повторяться сколько угодно раз.
А может точек вообще не будет.+Повторяется от 1 до бесконечности раз.
Например, regexf+означает, что буква f должна быть хотя бы 1 раз.
Этих f может быть хоть 20, но как минимум 1 раз f точно должна быть, т.к.+– это от 1 до бесконечности.?Повторяется 0 или 1 раз.
Например, regexf?означает, что символ f может быть, а может не быть.
Но если он есть, то только 1 раз.^Строка должна начинаться с того символа или символов, которые идут после
^
Например, regex^Аняозначает, что строка Аня любит маму проходит соответствие.
А вот строка Андрей любит маму нас не устроит, потому что строка не начинается с Аня.
Анна любит маму также не прокатит, т.к. Анна – это всё ещё не Аня.[^]Всё, что находится внутри квадратных скобок после уголка не должно встречаться в строке.
Например, regex[^Аня]означает, что строка Аня любит маму не прокатит, т.к. в строке присутствует Аня.
Также не прокатит такая строка: Мама сказала, что Аня молодец, т.к. в строке присутствует Аня.
Вот строка Андрей любит маму пройдёт соответствие, т.к. никаких Аня в строке вообще ни разу не встречается.
Не важно, как начинается строка, важно, чтобы в ней не было Аня.[]Означает, что в строке должно быть то, что находится внутри квадратных скобок.
Если наш regex[Лев]– это значит, что нам нужно где угодно встретить буквально такие буквы.
Например, regex[Лев]будет полностью удовлетворять строке: Левша оказался мастером.
Потому что в слове Левша присутствует Лев.
Если нам нужен Лев, как кот, то добавляем пробел после слова лев, вот так:[Лев ]^[^]Строка не должна начинаться на то, что находится внутри квадратных скобок после уголка.
Например, regex^[^Аня]означает, что строка Аня любит маму не прокатит, т.к. строка начинается с Аня.
Вот строка Мама сказала, что Аня молодец пройдёт соответствие, т.к. никаких Аня в начале строки нет.
Не важно, что в строке присутствует Аня, главное, чтобы строка не начиналась с Аня.$Строка должна заканчиваться на символ или символы, которые идут до знака $
Например, regex\.$означает, что строка должна заканчиваться буквально на точку.
И строка Аня молодец. проходит соответствие, т.к. строка заканчивается на точку.
А вот regexмолодец$она уже не пройдёт, потому что на конце не должно быть точек, просто молодец.\wЭтот символ заменяет любую латинскую букву (хоть маленькую хоть большую), а также любые цифры и нижнюю чёрточку _ \WЭто любой символ, но только не \w\dЛюбая цифра \DЧто угодно, но только не цифра \sСимвол пробела, [simple_tooltip content='несколько пробелов именно по нажатию Tabна клавиатуре']табуляции[/simple_tooltip], отступа и перехода на новую строку и return.
Чтобы найти Лев, можно искать так:[Лев ]или так:[Лев\s]
Это одно и то же.\SВсё, что угодно, что не является \s-Дефис – это спецсимвол, который, если находится в квадратных скобках, говорит о диапазоне.
Например, regex[а-ж]говорит о том, что мы ищем русские буквы от а до ж.
Строка Аня не пройдёт regex[а-ж], т.к. А большая, а н и я не попадают в диапазон между а и ж.
Строка Анна пройдёт соответствие, т.к. в конце встречается буква а и она маленькая.Например, regex
[0-9]говорит о том, что мы ищем число от 0 до 9.Чтобы указать несколько диапазонов букв, маленьких и больших, а также цифры, мы делаем так:
[a-zA-Z0-9]
Из-за того, что это довольно часто приходится делать, мы сокращаем эту форму вот так\w
Это то же самое. Но если говорить совсем строго, то эквивалент\wравен[a-zA-Z0-9_]
То есть там есть ещё и нижняя чёрточка.ВАЖНО!
Если ваш regex[а-яА-Я], то строка Алёна не пройдёт соответствия, т.к. однажды какой-то бессовестный уёбок забыл про бедную букву ё и уже несколько десятилетий простые люди и программисты рано или поздно нарываются на это. Поэтому смиритесь с тем, что букву ё нужно дополнительно указывать. Можно так:[ёЁа-яА-Я], можно так:[а-яёЁА-Я], можно так:[а-яА-ЯёЁ]{}Фигурными скобками мы указываем, сколько раз нам нужно, чтобы встречался символ или символы.
Например, regex[н]{2}будет говорить нам о том, что в строке 2 раза должно встречаться н.
Таким образом Аня не пройдёт соответствие, а вот Анна пройдёт.Можно указать и так:
[е]{2,3}. Данный regex ищет буквы е, которые встречаются от двух до трёх раз.
Например строка Длинношеее пройдёт соответствие, а вот Лена не пройдёт.
Например regexе{1,}говорит о том, что мы ищем строку, где буква е встречается от 1 раза до бесконечности.
То есть, если после запятой мы ничего не указали, значит это сколько угодно.
И Да,е{1,}проще заменить наe+()1. Круглые скобки позволяют указать варианты чего-то или чего-то.
2. Также круглые скобки заключат в себя что-то, что является группой, к которой можно обратиться.
Рассмотрим 1 вариант использования скобок.
Например, regexА(н|л)яуказывает нам на то, что мы ищем либо Аня либо Аля. Нас устроит или то или другое.
Вертикальную палочку нужно воспринимать как или.
Например, regexА(нн|лл)ауказывает нам на то, что мы ищем либо Анна либо Алла. Нас устроит или то или другое.
Рассмотрим 2 вариант использования скобок.
Если нам нужно что-то прописывать несколько раз, то проще загнать это в [simple_tooltip content='Типа переменную, чтобы 100 раз не писать']группу[/simple_tooltip].
Допустим мы проверяем на корректность ввода email вот так:
^[a-z0-9\-._]+@[a-z0-9\-._]+\.[a-z]+$
и что-то нам подсказывает, что можно покороче и не повторяться с[a-z0-9\-._]и мы делаем так:
^([a-z0-9\-._])+@(?1)+\.[a-z]+$
Мы взяли в скобки наш паттерн[a-z0-9\-._]и вместо того, чтобы писать его снова, мы пишем(?1)
ВАЖНО!
Этот фокус сработает в JavaScript и php, для которого это всё изначально было придумано.
Но не прокатит в C#. На языке C# мы должны будем писать так:
^([a-z0-9\-._]+)@\1+\.[a-z]+$
То есть вместо(?1)мы пишем\1, указывая таким образом номер группы.
Также знак+заходит внутрь скобок.Можно на js, php, C# и прочих универсально назначить имя группы и обращаться по имени группы, вот так:
^(?<name>[a-z0-9\-._])+@(\k<name>)+\.[a-z]+$
Минусом такого подхода является то, что почта почта@почта.ком не прокатит, т.к. после значка @ ожидается буквально то же самое, что в группе<name>. Вы можете подумать, да и хрен бы с ним, буду юзать лучше так:
^([a-z0-9\-._]+)@\1+\.[a-z]+$
Но спешу расстроить кодеров на C#. Подобный regex, хоть в первом случае, хоть во втором всегда ищет после @ ровно в точности то же самое, что было до неё. То есть на C# regex пройдёт только такая строка почта@почта.ком или имя@имя.ком
Да, это пиздец, но ничего вы с этим не сделаете. Можете пожаловаться в Microsoft, но им как бы похуй.(?<=)Поиск окружающего текста слева от нужного слова или символа.
Есть у нас строка: Сейчас самое время поискать музыку, хотя время, на самом деле, позднее.
И в ней два раза встречается слово время. Нам нужно найти только те слова время, перед началом которых есть слово самое.
Мы будем искать так:(?<=самое )время
И он найдёт нам только слово время без самое.Тут важно понимать, что он не цепляет маску, по которой мы ищем. Нет. Он находит только время.
Мы же ищем только слово время, верно? Ну, вот, таким образом мы говорим регулярке:
Найди-ка нам время, а заодно убедись, чтобы там спереди точно шло самое.
Вот если есть в строке самое время, то покажи нам это время.То же самое будет с отрицанием. Если нам не нужно находить слово время, перед которым идёт самое.
Мы в таком случае будем регулярить так:(?<!самое )время
В данном случае восклицательным знаком мы делаем отрицание слова самое.(?=)Поиск окружающего текста справа от нужного слова или символа.
Есть у нас строка: Сейчас самое время поискать музыку, хотя время, на самом деле, позднее.
И в ней два раза встречается слово время. Нам нужно найти только то слово время, после которого идёт запятая.
Мы будем искать так:время(?=,)Если нам нужно слово время, после которого нельзя, чтобы шла запятая, мы будем искать так:
время(?!,)
Основы регулярных выражений
Видео на YouTube
Скопировано. |
Любой символ. Хоть буква, хоть цифра, хоть точка, хоть пробел. |
Скопировано\ |
Это символ экранирования. Нам вот нужно указать точку буквально, и поэтому мы пишем так: Скопировано\.И таким Скопировано\ мы можем экранировать любые спецсимволы. |
Скопировано* |
Повторяется от 0 до бесконечности раз. Например, regex Скопировано.* означает любой символ или символы, которые могут повторяться сколько угодно раз.А может их вообще не будет ни одного, потому что Скопировано* – это от 0 до бесконечности.Например, regex Скопировано\.* означает, что символ точки может повторяться сколько угодно раз.А может точек вообще не будет. |
Скопировано+ |
Повторяется от 1 до бесконечности раз. Например, regex Скопированоf+ означает, что буква f должна быть хотя бы 1 раз.Этих f может быть хоть 20, но как минимум 1 раз f точно должна быть, т.к. Скопировано+ – это от 1 до бесконечности. |
Скопировано? |
Повторяется 0 или 1 раз. Например, regex Скопированоf? означает, что символ f может быть, а может не быть.Но если он есть, то только 1 раз. |
Скопировано^ |
Строка должна начинаться с того символа или символов, которые идут после |
Скопировано[^] |
Всё, что находится внутри квадратных скобок после уголка не должно встречаться в строке. Например, regex Скопировано[^Аня] означает, что строка Аня любит маму не прокатит, т.к. в строке присутствует Аня.Также не прокатит такая строка: Мама сказала, что Аня молодец, т.к. в строке присутствует Аня. Вот строка Андрей любит маму пройдёт соответствие, т.к. никаких Аня в строке вообще ни разу не встречается. Не важно, как начинается строка, важно, чтобы в ней не было Аня. |
Скопировано[] |
Означает, что в строке должно быть то, что находится внутри квадратных скобок. Если наш regex Скопировано[Лев] – это значит, что нам нужно где угодно встретить буквально такие буквы.Например, regex Скопировано[Лев] будет полностью удовлетворять строке: Левша оказался мастером.Потому что в слове Левша присутствует Лев. Если нам нужен Лев, как кот, то добавляем пробел после слова лев, вот так: Скопировано[Лев ] |
Скопировано^[^] |
Строка не должна начинаться на то, что находится внутри квадратных скобок после уголка. Например, regex Скопировано^[^Аня] означает, что строка Аня любит маму не прокатит, т.к. строка начинается с Аня.Вот строка Мама сказала, что Аня молодец пройдёт соответствие, т.к. никаких Аня в начале строки нет. Не важно, что в строке присутствует Аня, главное, чтобы строка не начиналась с Аня. |
Скопировано$ |
Строка должна заканчиваться на символ или символы, которые идут до знака Скопировано$Например, regex Скопировано\.$ означает, что строка должна заканчиваться буквально на точку.И строка Аня молодец. проходит соответствие, т.к. строка заканчивается на точку. А вот regex Скопированомолодец$ она уже не пройдёт, потому что на конце не должно быть точек, просто молодец. |
Скопировано\w |
Этот символ заменяет любую латинскую букву (хоть маленькую хоть большую), а также любые цифры и нижнюю чёрточку _ |
Скопировано\W |
Это любой символ, но только не Скопировано\w |
Скопировано\d |
Любая цифра |
Скопировано\D |
Что угодно, но только не цифра |
Скопировано\s |
Символ пробела, [simple_tooltip content='несколько пробелов именно по нажатию СкопированоTab на клавиатуре']табуляции[/simple_tooltip], отступа и перехода на новую строку и return.Чтобы найти Лев, можно искать так: Скопировано[Лев ] или так: Скопировано[Лев\s]Это одно и то же. |
Скопировано\S |
Всё, что угодно, что не является Скопировано\s |
Скопировано- |
Дефис – это спецсимвол, который, если находится в квадратных скобках, говорит о диапазоне. Например, regex Скопировано[а-ж] говорит о том, что мы ищем русские буквы от а до ж.Строка Аня не пройдёт regex Скопировано[а-ж], т.к. А большая, а н и я не попадают в диапазон между а и ж.Строка Анна пройдёт соответствие, т.к. в конце встречается буква а и она маленькая. Например, regex Чтобы указать несколько диапазонов букв, маленьких и больших, а также цифры, мы делаем так: ВАЖНО! |
Скопировано{} |
Фигурными скобками мы указываем, сколько раз нам нужно, чтобы встречался символ или символы. Например, regex Скопировано[н]{2} будет говорить нам о том, что в строке 2 раза должно встречаться н.Таким образом Аня не пройдёт соответствие, а вот Анна пройдёт. Можно указать и так: |
Скопировано() |
1. Круглые скобки позволяют указать варианты чего-то или чего-то. Рассмотрим 1 вариант использования скобок. Рассмотрим 2 вариант использования скобок. ВАЖНО! Можно на js, php, C# и прочих универсально назначить имя группы и обращаться по имени группы, вот так: |
Скопировано(?<=) |
Поиск окружающего текста слева от нужного слова или символа. Тут важно понимать, что он не цепляет маску, по которой мы ищем. Нет. Он находит только время. То же самое будет с отрицанием. Если нам не нужно находить слово время, перед которым идёт самое. |
Скопировано(?=) |
Поиск окружающего текста справа от нужного слова или символа. Есть у нас строка: Сейчас самое время поискать музыку, хотя время, на самом деле, позднее. И в ней два раза встречается слово время. Нам нужно найти только то слово время, после которого идёт запятая. Мы будем искать так: Скопировановремя(?=,)
Если нам нужно слово время, после которого нельзя, чтобы шла запятая, мы будем искать так: |