Forum

Пожалуйста or Регистрация для создания сообщений и тем.

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

Основы регулярных выражений
 Видео на 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 Скопировано\.$ означает, что строка должна заканчиваться буквально на точку.
И строка Аня молодец. проходит соответствие, т.к. строка заканчивается на точку.
А вот 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, но им как бы похуй.

Скопировано(?<=)

Поиск окружающего текста слева от нужного слова или символа.
Есть у нас строка: Сейчас самое время поискать музыку, хотя время, на самом деле, позднее.
И в ней два раза встречается слово время. Нам нужно найти только те слова время, перед началом которых есть слово самое.
Мы будем искать так: Скопировано(?<=самое )время
И он найдёт нам только слово время без самое.

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

То же самое будет с отрицанием. Если нам не нужно находить слово время, перед которым идёт самое.
Мы в таком случае будем регулярить так: Скопировано(?<!самое )время
В данном случае восклицательным знаком мы делаем отрицание слова самое.

Скопировано(?=) Поиск окружающего текста справа от нужного слова или символа.
Есть у нас строка: Сейчас самое время поискать музыку, хотя время, на самом деле, позднее.
И в ней два раза встречается слово время. Нам нужно найти только то слово время, после которого идёт запятая.
Мы будем искать так: Скопировановремя(?=,)

Если нам нужно слово время, после которого нельзя, чтобы шла запятая, мы будем искать так:
Скопировановремя(?!,)

 

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

Удаленный пользователь, Удаленный пользователь и ещё 8 отреагировали на эту запись.
Удаленный пользовательУдаленный пользовательУдаленный пользовательУдаленный пользовательУдаленный пользовательУдаленный пользовательУдаленный пользовательУдаленный пользовательУдаленный пользовательУдаленный пользователь