Многие пользовались поиском файлов в своей операционной системе. Например, "*.txt", где * это любая последовательность символов, а ? - это один произвольный символ. Так вот. Это не регулярные выражения. Подобные выражения называются файловыми глобами или Групповыми символами (wildcards).
Дальше про регулярные выражения
По аналогии, специальные символы, которые не несут буквальный смысл, называются метасимволами. Все остальные символы, несущие буквальный смысл, называются литералами.
Под строкой подразумевается не переменная с типом string, а любой текст в его начале и после символа переноса строки. Аналогично конец строки.
^Отчет
- найдет все строки, начинающиеся со слова "Отчет"txt$
- найдет все строки заканчивающиеся на "txt"Специфика заключается в том, что они совпадают с определенной позицией в строке, а не с символами текста.
Выражение ^$
совпадет с пустой строкой.
Символьный класс [квадратные скобки] - это очень важное понятие. Потому что одни и те же символы могут обозначать совершенно разные вещи внутри него и снаружи. Например, точка "." за пределами символьного класса является метасимволом и обозначает любой литерал. А внутри скобок [.] воспринимается буквально и будет совпадать с точкой.
[...] - в квадратных скобках можно перечислить символы, которые могут находиться в данной позиции.
Выражение [e]
- совпадает с буквой "е", а выражение [ea]
- совпадет с любой из этих букв.
Внутри символьного класса дефис - это интервал. Например, [0123456789]
= [0-9]
Выбрать все html-теги заголовков можно конструкцией <H[1-6]>
.
Если дефис стоит в символьном классе первым, то он не может обозначать интервал, поэтому он будет интерпретироваться как литерал, то есть буквально.
[^..] - класс совпадет с любыми символами, не входящими в него. Внутри символьного класса "^" имеет уже другой смысл.
[^1-6]
- совпадет с любыми символами не принадлежащими интервалу 1-6.
| - означает "или". Например, Bob|Robert
. Используется как метасимвол вне символьного класса. То есть внутри [|]
он будет воспринят буквально, как поиск вертикальной черты.
Подвыражения, объединенные таким способом называются альтернативами.
Конструкцию выбора можно отделять от остального выражения круглыми скобками, то есть gray|grey
= gr(a|e)y
.
Если нужно, чтобы метасимвол воспринимался буквально, нужно поставить перед ним слеш \
Другими словами - экранированный метасимвол становится литералом. Например поиск скобок в тексте должен выглядеть так \(
и \)
.
Аналогично слеш превращает некоторые литералы в метасимволы. Например, \t
- знак табуляции.
Квантификаторы определяют количество экземпляров элемента после которого стоят.
Метасимвол | Обозначение | Пример |
---|---|---|
. (точка) | заменяет любой символ (кроме переноса строки) | |
? (знак вопроса) | предшествующий ему символ является не обязательным | (July|Jul) = (July?) |
+ (плюс) | предшествующий символ встречается один или несколько раз | |
* (звездочка) | предш. символ встречается любое количество раз, в том числе 0 раз | |
{min, max} | количество совпадений от min до max | [a-zA-Zа-яА-Я]{3,12} - букв должно быть не менее 3, но и не более 12 |
{0,1} | Эквивалентно метасимволу ? | |
{1,} | Эквивалентно метасимволу + | |
{0,} | Эквивалентно метасимволу * | |
( ) круглые скобки | Применяются для группировки, сохранения совпавшего текста или ограничения конструкций выбора | |
\t | Табуляция | |
\n | Перенос строки | |
\r | Возврат каретки | |
\s | Любой пропуск. Объединяет в себе пробелы, табуляции, перенос строки, возврат каретки | |
\S | Все, что не относится к \s | |
\b | Граница слова. После него должны следовать словесные символы и тогда это начало слова. Либо перед ним должны стоять словесные символы и тогда это конец слова. | |
\w | Любая цифра, буква или знак подчеркивания | [a-zA-Zа-яА-Я0-9_] |
\W | Все, что не относится к \w | |
\d | Цифры | [0-9] |
\D | все, что не относится к \d | [^0-9] |
Позволяют искать текст, который совпал с предыдущей частью выражения.
Например, нам нужно найти повторяющееся слово в тектсе. \b([a-zA-Z]+) \1
- здесь метасимвол \1
будет ссылкой на подвыражение в скобках. Сначала мы ищем начало слова, за ним будут следовать одна или несколько букв, затем пробел и потом эта же последовательность букв.
Кажой паре скобок будет соответствовать номер \1 \2 \3 ...
.
Пары скобок нумеруются в соответствии с порядковым номером открывающейся скобки слева направо. Поэтому можно вкладывать скобки друг в друга.
Часто бывает так, что в одном выражении применяется несколько пар круглых скобок. Некоторые из них нужны для группировки текста с последующим применением к нему квантификатора, некоторые для конструкций выбора, некоторые для ссылок.
Когда мы ссылаемся на скобки, удобно отделить остальные пары скобок не предназначенные для ссылок.
Для этого существует конструкция (?: )
. Это обеспечивает группировку без сохранения. То есть этим скобкам не будет присвоен номер.
\1 \2 \3
эти скобки можно не учитывать