Регулярные выражения windows поиск
Обновлено: 04.07.2024
Регулярные выражения представляют собой похожий, но гораздо более сильный инструмент для поиска строк, проверки их на соответствие какому-либо шаблону и другой подобной работы. Англоязычное название этого инструмента — Regular Expressions или просто RegExp. Строго говоря, регулярные выражения — специальный язык для описания шаблонов строк.
Реализация этого инструмента различается в разных языках программирования, хоть и не сильно. В данной статье мы будем ориентироваться в первую очередь на реализацию Perl Compatible Regular Expressions.
Основы синтаксиса
25–27 ноября, Онлайн, Беcплатно
Однако уже здесь следует быть аккуратным — как и любой язык, регекспы имеют спецсимволы, которые нужно экранировать. Вот их список: . ^ $ * + ? < >[ ] \ | ( ) . Экранирование осуществляется обычным способом — добавлением \ перед спецсимволом.
Набор символов
Предопределённые классы символов
Если необходимо описать вообще любой символ, для этого используется точка — . . Если указанные классы написать с заглавной буквы ( \S , \D , \W ) то они поменяют свой смысл на противоположный — любой непробельный символ, любой символ, который не является цифрой, и любой символ кроме латиницы, цифр или подчёркивания соответственно.
Диапазоны
Квантификаторы
Примеры использования квантификаторов в регулярных выражениях
Обратите внимание, что квантификатор применяется только к символу, который стоит перед ним.
Некоторые часто используемые конструкции получили в языке RegEx специальные обозначения:
Спецобозначения квантификаторов в регулярных выражениях.
Ленивая квантификация
Предположим, перед нами стоит задача — найти все HTML-теги в строке
Очевидное решение <.*> здесь не сработает — оно найдёт всю строку целиком, т.к. она начинается с тега абзаца и им же заканчивается. То есть содержимым тега будет считаться строка
Это происходит из-за того, что по умолчанию квантификатор работают по т.н. жадному алгоритму — старается вернуть как можно более длинную строку, соответствующую условию. Решить проблему можно двумя способами. Первый — использовать выражение <[^>]*> , которое запретит считать содержимым тега правую угловую скобку. Второй — объявить квантификатор не жадным, а ленивым. Делается это с помощью добавления справа к квантификатору символа ? . Т.е. для поиска всех тегов выражение обратится в <.*?> .
Ревнивая квантификация
Чуть больше о жадном, сверхжадном и ленивом режимах квантификации вы сможете узнать из статьи о регулярных выражениях в Java.
Скобочные группы
Запоминание результата поиска по группе
Оказывается, результат поиска по скобочной группе записывается в отдельную ячейку памяти, доступ к которой доступен для использования в последующих частях регэкспа. Возвращаясь к задаче с поиском HTML-тегов на странице, нам может понадобиться не только найти теги, но и узнать их название. В этом нам может помочь регулярное выражение <(.*?)> .
Если выражение берётся в скобки только для применения к ней квантификатора (не планируется запоминать результат поиска по этой группе), то сразу после первой скобки стоит добавить ?: , например (?:[abcd]+\w) .
С использованием этого механизма мы можем переписать наше выражение к виду [Хх]([аоие])х?(?:\1х?)* .
Перечисление
Полезные сервисы
Потренироваться и/или проверить регулярное выражение на каком-либо тексте без написания кода можно с помощью таких сервисов, как RegExr, Regexpal или Regex101. Последний, вдобавок, приводит краткие пояснения к тому, как регулярка работает.
Разобраться, как работает регулярное выражение, которое попало к вам в руки, можно с помощью сервиса Regexper — он умеет строить понятные диаграмы по регуляркам.
RegExp Builder — визуальный конструктор функций JavaScript для работы с регулярными выражениями.
Больше инструментов можно найти в нашей подборке.
Задания для закрепления
Найдите время
Java[^script]
Найдет ли регулярка Java[^script] что-нибудь в строке Java? А в строке JavaScript?
Разобрать арифметическое выражение
Арифметическое выражение состоит из двух чисел и операции между ними, например:
Также могут присутствовать пробелы вокруг оператора и чисел.
Напишите регулярку, которая найдёт, как всё арифметическое действие, так и (через группы) два операнда.
Регулярное выражение для числа, возможно, дробного и отрицательного: -?\d+(\.\d+)? .
Оператор – это [+*/\-] . Заметим, что дефис мы экранируем. Нам нужно число, затем оператор, затем число, и необязательные пробелы между ними. Чтобы получить результат в требуемом формате, добавим ?: к группам, поиск по которым нам не интересен (отдельно дробные части), а операнды наоборот заключим в скобки. В итоге:
Кроссворды из регулярных выражений
Такие кроссворды вы можете найти у нас.
Регулярные выражения предоставляют мощный, гибкий и эффективный способ обработки текста. Комплексная нотация сопоставления шаблонов регулярных выражений позволяет быстро анализировать большие объемы текста в следующих целях:
- поиск определенных шаблонов символов;
- проверка текста на соответствие предопределенному шаблону (например, адресу электронной почты);
- извлечение, изменение, замена или удаление текстовых подстрок;
- добавление извлеченных строк в коллекцию для создания отчета.
Для многих приложений, которые работают со строками или анализируют большие блоки текста, регулярные выражения — незаменимый инструмент.
Принцип работы регулярных выражений
Шаблон регулярного выражения для определения текста.
Текст, который будет проанализирован на соответствие шаблону регулярного выражения.
Методы класса Regex позволяют выполнять следующие операции:
Определить, входит ли шаблон регулярного выражения во входной текст, с помощью метода Regex.IsMatch. Пример использования метода IsMatch для проверки текста см. в разделе Руководство. Проверка строк на соответствие формату электронной почты.
Получить один или все экземпляры текста, соответствующего шаблону регулярного выражения с помощью метода Regex.Match или Regex.Matches. Первый метод возвращает объект System.Text.RegularExpressions.Match, который предоставляет сведения о соответствующем тексте. Второй метод возвращает объект MatchCollection, содержащий один объект System.Text.RegularExpressions.Match для каждого соответствия, обнаруженного в обработанном тексте.
Заменить текст, соответствующий шаблону регулярного выражения, с помощью метода Regex.Replace. Примеры использования метода Replace для изменения форматов даты и удаления недопустимых символов из строки см. в разделах Руководство. Исключение недопустимых символов из строки и Руководство. Изменение форматов даты.
Обзор объектной модели регулярных выражений см. в разделе Объектная модель регулярных выражений.
Дополнительные сведения о языке регулярных выражений см. в кратком справочнике по элементам языка регулярных выражений или в одной из следующих брошюр, который вы можете скачать и распечатать:
Примеры регулярных выражений
Класс String содержит ряд методов для поиска и замены строк, которые можно использовать для поиска строковых литералов в длинных строках. Регулярные выражения максимально полезны, если требуется найти одну из нескольких подстрок в длинной строке или определить шаблоны в строке, как показано в следующих примерах.
Пример 1: Замена подстрок
Предположим, что список рассылки содержит имена, в которые иногда входит обращение (Mr., Mrs., Miss или Ms.) в дополнение к имени и фамилии. Если вы не хотите включать обращения при создании этикеток для конвертов из списка, с помощью регулярного выражения их можно удалить, как показано в следующем примере.
Шаблон регулярного выражения (Mr\.? |Mrs\.? |Miss |Ms\.? ) сопоставляет все вхождения строк "Mr", "Mr.", "Mrs", "Mrs.", "Miss", "Ms" или "Ms.". После вызова метода Regex.Replace сопоставленная строка заменяется на String.Empty; другими словами, она удаляется из исходной строки.
Пример 2: Поиск повторяющихся слов
Случайный повтор слов — это распространенная ошибка при написании текстов. Регулярное выражение можно использовать для определения повторяющихся слов, как показано в следующем примере.
Шаблон регулярного выражения \b(\w+?)\s\1\b интерпретируется следующим образом:
Шаблон | Интерпретация |
---|---|
\b | Начало на границе слова. |
(\w+?) | Соответствует одному или нескольким символам слова (как можно меньшему количеству). Вместе они формируют группу, к которой можно обращаться как к \1 . |
\s | Соответствует пробелу. |
\1 | Сопоставление подстроки, равной группе с именем \1 . |
\b | Соответствует границе слова. |
Метод Regex.Matches вызывается с параметрами регулярного выражения RegexOptions.IgnoreCase. Поэтому операция сопоставления учитывает регистр, а пример указывает, что подстрока "This this" является повтором.
Пример 3. Динамическое создание регулярного выражения с учетом языка и региональных параметров
На компьютере с региональными параметрами "English - United States (en-US)" пример динамически создает регулярное выражение \$\s*[-+]?(1(,5)*(\.5+)?) . Шаблон регулярного выражения интерпретируется следующим образом:
Шаблон | Интерпретация |
---|---|
\$ | Выполняется поиск одного вхождения символа доллара ( $ ) во входной строке. Строка шаблона регулярного выражения содержит обратную косую черту, что говорит о том, что символ доллара интерпретируется буквально, а не как привязка регулярного выражения. (Отдельный символ $ указывает, что механизм регулярных выражений должен начинать сопоставление с конца строки.) Чтобы правильно обработать текущий символ валюты, в примере вызывается метод Regex.Escape, который экранирует символ. |
\s* | Поиск нуля или нескольких вхождений пробела. |
[-+]? | Поиск нуля или нескольких вхождений знака плюс или минус. |
(3(,4)*(\.5+)?) | Внешние круглые скобки вокруг этого выражения делают его захватываемой группой или частью выражения. Если найдено соответствие, сведения об этой части строки можно получить из второго объекта Group в объекте GroupCollection, который возвращается свойством Match.Groups. (Первый элемент в коллекции представляет все сопоставление.) |
5 | Поиск 0-3 вхождений десятичных цифр (0-9). |
(,2)* | Поиск нуля или нескольких вхождений разделителя группы, за которыми следуют три десятичные цифры. |
\. | Поиск одного вхождения десятичного разделителя. |
1+ | Поиск одной или нескольких десятичных цифр. |
(\.1+)? | Поиск нуля или одного вхождения десятичного разделителя, за которым следует по крайней мере одна десятичная цифра. |
Если каждый из этих подшаблонов найден во входной строке, сопоставление является успешным, а объект Match с информацией о сопоставлении добавляется в объект MatchCollection.
Регулярные выражения также состоят из обычных и метасимволов и работают по тому же принципу, но имеют гораздо больше возможностей и, соответственно, более сложный синтаксис. Так предыдущий пример (*.txt) с помощью регэкспов будет выглядеть так (.*\.txt).
Оператор match
″PowerShell″ -match ″power″ -> True
″Shell″ -match ″power″ -> False
Если же оператору скормить несколько строк, то он вернет те, которые подходят под заданное выражение:
″Power″, ″Shell″ -match ″power″ -> Power
Важно понимать, что при проверке регулярного выражения нет необходимости в полном совпадении текста. Для положительного результата оператору требуется лишь наличие подходящих символов в тексте, например:
″PowerShell″ -match ″rsh″ -> True
С помощью оператора match можно обрабатывать не только текстовые данные, но и любые другие объекты. В качестве примера получим список служб и выберем те из них, в названии которых присутствует ″event″:
Регистрозависимость
″PowerShell″ -match ″power″ -> True
Если необходимо учитывать регистр символов, то можно приставить к оператору сравнения букву С (от Case Sensitive). Получившийся оператор cmatch регистрозависим, соответственно при его использовании выражение уже не будет соответствовать действительности:
″PowerShell″ -cmatch ″power″ -> False
Кроме того, есть возможность включать регистрозависимость средствами самих регулярных выражений, где в качестве переключателей используются конструкции (?i) и (?-i). При использовании оператора match (?-i) включает зависимость от регистра, а (?i) отключает. Например:
″PowerShell″ -match ″(?-i)power″ -> False
″PowerShell″ -match ″(?i)power″ -> True
Плюс использования (?i) и (?-i) в том, что с их помощью можно задавать регистрозависимость не для всего выражения, а для его части. Например:
″PowerShell″ -match ″power(?-i)Shell″ -> True
″PowerShell″ -match ″power(?-i)shell″ -> False
Используя регистрозависимые выражения необходимо учитывать, что при изменении регистра результат может очень сильно отличаться. Например, два практически одинаковых выражения выдают абсолютно разные результаты:
Get-Service | where
Get-Service | where
Якоря
Для положительного результата регулярному выражению требуется лишь наличие подходящих символов, независимо от их расположения в тексте. Это поведение по умолчанию, но его можно изменить с помощью специальных метасимволов, называемых якорями (anchors). Якоря позволяют точно указать на позицию в строке, в которой должны находиться искомые символы.
Метасимволы крышка ^ и \A совпадают с началом строки, перед первым символом. Для примера выведем список служб, начинающихся с символа ″b″:
Метасимволы доллар $, \Z или \z совпадают с окончанием строки. Для примера выведем список служб, заканчивающихся на ″s″:
Здесь может возникнуть вопрос, есть ли отличия между якорями (например между $,\Z и \z) и когда какой из них лучше использовать. Для этого представим разбираемый с помощью регулярного выражения объект как текст, состоящий из физических строк (string), разделенных символом новой строки (\n):
По умолчанию объект обрабатывается построчно, однако существует расширенный режим привязки к строкам (multiline), в котором одной логической строке могут соответствовать несколько физических строк, разделенных символом \n. В зависимости от режима обработки совпадение символов может различаться:
Границы
Как уже было сказано, для регулярного выражения нет необходимости в точном совпадении, достаточно наличия искомых символов в тексте. Так например слово ″cat″ будет найдено не только в ″My cat is fat″, но и в ″bob cat ″, ″ cat egory″, ″stac cat o″ и прочих, которые не имеют ни малейшего отношения к кошачьим. Поэтому, если необходимо только целое слово, можно обозначить его границы (boundaries) с помощью метасимвола \b.
Для примера выведем список файлов в директории, содержащих в названии слово power:
Get-ChildItem ′C:\Files\PS Books′ | where
А теперь предположим, что мне нужно, чтобы слово power в названии присутствовало отдельно от прочих. Изменим команду, обозначив границы слова:
Get-ChildItem ′C:\Files\PS Books′ | where
Get-ChildItem ′C:\Files\PS Books′ | where
Примечание. На всякий случай уточню, что метасимволы \b и \B вовсе не обязаны быть парными. Их можно использовать поодиночке и в различных сочетаниях, например \bpower, power\B или \bpower\B.
Классы символов
Примерно определившись, где искать, переходим к тому, что искать. Для поиска в регулярных выражениях можно использовать классы символов. Например, символьный класс [ds] совпадает с одним любым из указанных в скобках символов:
Символы в классе можно указывать не по одному, а задавать в виде диапазона. Например [e-v] совпадает с одним любым символом, находящемся в указанном диапазоне (от e до v):
Примечание. Знак дефис (-) внутри класса является метасимволом и обозначает диапазон символов. Если вы хотите указать дефис как обычный символ, то его необходимо поставить в начале выражения, например так [-a-z], либо экранировать.
Отдельные символы и диапазоны можно комбинировать, например [adev-z] означает ″a или d или e или любой символ от v до z″. Подобным образом можно обозначать любые классы символов, например [a-z] означает любой символ латинского алфавита, а 3 соответственно любую цифру.
Для наиболее распространенных классов есть сокращенные обозначения:
Примечание. В класс \w могут входить и символы других алфавитов, в зависимости от используемого на компьютере языка.
Для примера выведем список файлов в директории, в названии которых присутствуют цифры:
Get-ChildItem ′C:\Files\PS Books′ | where
Ну и наиболее общим символьным классом в регулярных выражениях является точка (.), которая описывает один любой символ. Для примера выведем службу с именем, начинающимся на b, заканчивающуюся на s, между которыми могут находиться любые два символа:
Отрицательные классы
Иногда проще пойти от обратного, т.е. не перечислять все символы, которые должны присутствовать в строке, а указать только те, которых там быть не должно. Сделать это можно с помощью уже знакомого нам символа крышка (^). Так выражение [^adf] означает ″любой символ кроме a,d или f″. Крышка, поставленная в качестве первого символа в классе, означает отрицание, а сам класс называется отрицательным (или инвертированным).
Для примера выведем все файлы в директории, кроме файлов с расширением pdf:
Get-ChildItem ′C:\Files\PS Books′ | where
Для основных классов (\w,\d,\s) есть альтернативный вариант отрицания. Для того, чтобы включить в них отрицание, достаточно перевести их в верхний регистр:
Оператор notmatch
Get-ChildItem ′C:\Files\PS Books′ | where
Экранирование
Как уже упоминалось, в регулярных выражениях есть обычные символы и метасимволы. Но иногда бывает необходимо использовать метасимволы в качестве обычных литералов. Сделать это можно, заэкранировав метасимвол с помощью обратного слэша (\).
Например, нам нужно найти все файлы, содержащим инициалы E. в названии. Попробуем сделать так:
Get-ChildItem ′C:\Files\PS Books′ | where
Поскольку в данном случае точка является метасимволом, то в результате мы получим файлы, имеющие в своем названии ″букву E, за которой следует один любой символ″. А теперь заэкранируем точку и получим нужный результат:
1. Введение
Регулярные выражения — это широко используемый способ описания шаблонов для поиска текста и проверки соответствия текста шаблону.
Специальные метасимволы позволяют определять, например, что мы ищем подстроку в начале входной строки или n повторений определённого символа.
Регулярные выражения предназначены главным образом для профессионалов, однако могут быть полезны и при работе в офисе для поиска определённых документов (см. примеры ниже).
Double Commander поддерживает регулярные выражения в следующих функциях:
- Команды > Поиск файлов (в имени файла)
- Во встроенном редакторе
- В инструменте группового переименования
2. Простое сравнение
Любой символ совпадает с самим собой, если он не относится к специальным метасимволам, описанным чуть ниже.
Последовательность символов совпадает с такой же последовательностью во входной строке, так что шаблон "bluh" совпадет с подстрокой "bluh" во входной строке.
Если необходимо, чтобы метасимволы или escape-последовательности воспринимались как обычные символы, их нужно предварять символом "\" ("экранировать"), например, метасимвол "^" обычно совпадает с началом строк, однако, если записать его как "\^", то он будет совпадать с символом "^", "\\" совпадает с "\" и т.д.
3. Escape-последовательности
Любой символ может быть определён с помощью escape-последовательности так же, как это делается в языках C или Perl: "\n" означает начало строки, "\t" — табуляцию и т.д.
\xnn, где nn — это последовательность шестнадцатеричных цифр, означает символ с ASCII-кодом nn.
Если необходимо определить двухбайтный (Юникод) символ, используем формат "\x", где "nnnn" — одна или более шестнадцатеричных цифр.
4. Наборы символов
Вы можете определить набор, заключив символы в []. Набор будет совпадать с любым одним символов из перечисленных в нём.
Если первым символом набора (сразу после "[") идёт "^", то такой набор совпадает с любым символом не перечисленным в наборе.
Внутри набора символ "-" может быть использован для определения диапазона символов, например, a-z представляет все символы между "a" и "z", включительно.
Если необходимо включить в набор сам символ "-", поместите его в начало или конец набора или предварите символом "\".
Если вам необходимо поместить в набор сам символ "]", поместите его в самое начало или предварите "\".
5. Метасимволы
Метасимволы — это специальные символы, являющиеся важнейшим понятием в регулярных выражениях.
Существует несколько типов метасимволов.
5.1. Метасимволы - разделители строк
Выражения, помогающие указать разделители строк.
Метасимвол "^" по умолчанию совпадает только с началом входного текста, а метасимвол "$" — только с концом текста. Внутренние разделители строк, имеющиеся в тексте, не будут совпадать с "^" и "$".
Однако, если вам необходимо работать с текстом как с многострочным, чтобы "^" совпадал после каждого разделителя строки внутри текста, а "$" — перед каждым разделителем, то вы можете включить модификатор m.
Метасимволы \A и \Z аналогичны "^" и "$", но на них не действует модификатор m, т.е. они всегда совпадают только с началом и концом всего входного текста.
Метасимвол "." по умолчанию совпадает с любым символом, однако, если вы выключите модификатор s, то "." не будет совпадать с разделителями строк.
"^" совпадает с началом входного текста, а также, если включен модификатор m, с точкой, непосредственно следующей после \x0D\x0A, \x0A или \x0D (если вы используете Юникод-версию TRegExpr, то также \x2028, \x2029, \x0B, \x0C или \x85). Обратите внимание, что он не совпадает в промежутке внутри последовательности \x0D\x0A.
"$" совпадает с концом входного текста, а также, если включен модификатор m, с точкой, непосредственно предшествующей \x0D\x0A, \x0A или \x0D (если вы используете Юникод-версию TRegExpr, то также \x2028, \x2029, \x0B, \x0C или \x85). Обратите внимание, что он не совпадает в промежутке внутри последовательности \x0D\x0A.
"." совпадает с любым символом, но если выключен модификатор s, то "." не совпадает с \x0D\x0A, \x0A и \x0D (если вы используете Юникод-версию TRegExpr, то не совпадает также с \x2028, \x2029, \x0B, \x0C и \x85).
Обратите внимание, что "^.*$" (шаблон для пустой строки) не совпадает с пустой строкой вида \x0D\x0A, но совпадает с \x0A\x0D.
5.2. Метасимволы - стандартные наборы символов
Выражения, помогающие указать наборы символов.
Стандартные наборы \w, \d и \s можно использовать и внутри наборов символов .
5.3. Метасимволы - границы слов
Граница слова (\b) — позиция между двумя символами, один из которых удовлетворяет \w, а другой — \W (в любом порядке), при этом перед началом и после конца строки подразумевается \W.
5.4. Метасимволы - повторения
После любого элемента регулярного выражения может следовать очень важный тип метасимвола — повторитель (квантификатор).
Используя их, вы можете определить число допустимых повторений предшествующего символа, метасимвола или подвыражения.
Таким образом, задаёт минимум n повторов и максимум — m.
Повторитель эквивалентен и задаёт точно n повторов.
Повторитель задаёт минимум n повторов.
Теоретически величина параметров n и m не ограничена, но рекомендуется не задавать большие значения, поскольку в связи с рекурсивным характером работы обработка такого повторителя в некоторых ситуациях может потребовать существенных затрат времени и ОЗУ.
Если фигурные скобки встречаются в "неправильном" месте, где они не могут быть восприняты как повторитель, то они воспринимаются просто как символы.
Небольшое пояснение по поводу "жадности".
"Жадные" варианты повторителей пытаются захватить как можно большую часть входного текста, в то время как "не жадные" — как можно меньшую.
Например, "b+" как и "b*" примененные к входной строке "abbbbc" найдут "bbbb", в то время как "b+?" найдёт только "b", а "b*?" — вообще пустую строку; "b?" найдёт "bb", в то время как "b" найдёт "bbb".
Вы можете переключить все повторители в выражении в "не жадный" режим, воспользовавшись модификатором g.
5.5. Метасимволы - варианты
Вы можете определить набор вариантов , используя метасимвол "|" для их разделения, например "fee|fie|foe" найдёт или "fee", или "fie", или "foe" (так же, как "f(e|i|o)e").
В качестве первого варианта воспринимается всё от предыдущего метасимвола ("(", "[" или от начала выражения) до первого метасимвола "|", в качестве последнего — всё от последнего "|" до конца выражения или до ближайшего метасимвола ")".
Обычно, чтобы не запутаться, набор вариантов всегда заключают в круглые скобки, даже если без этого можно было бы обойтись.
Варианты пробуются начиная с первого и попытки завершаются сразу же, как удастся подобрать такой, при котором совпадет вся последующая часть выражения.
Это означает, что варианты не обязательно обеспечат "жадное" поведение.
Например, если применить выражение "foo|foot" ко входной строке "barefoot", то будет найдено "foo" т.к. это первый вариант, который позволил совпасть всему выражению.
Обратите внимание, что метасимвол "|" внутри наборов символов воспринимается как обычный символ, например, [fee|fie|foe] означает ровно то же самое что и [feio|].
5.6. Метасимволы - подвыражения
Метасимволы ( . ) могут также использоваться для определения подвыражений — по завершении поиска выражения вы можете обратиться к любому подвыражению, а также подставлять подвыражения как маску.
Подвыражения нумеруются слева направо, в порядке появления открывающих круглых скобок.
Первое подвыражение имеет номер "1", поддерживается до 90 подвыражений (выражение целиком — "0", к нему можно обращаться как "$0" или "$&").
Примечания о шаблонах "Заменить на":
- Если вы хотите использовать в шаблоне символы "$" и "\" как есть, то экранируйте их символом "\".
Пример: "1\$ \- это $2\\rub\\" вернёт "1$ - это <подвыражение2>\rub\". - Если вы хотите использовать цифры сразу после "$n", то должны взять n в фигурные скобки "<>".
Например, "a$12bc" вернёт "a<подвыражение12>bc", но "a$2bc" вернёт "a<подвыражение1>2bc".
Перевернём дату "21.01.2018" > "2018.01.21":
найти: (\d)\.(\d)\.(\d)
заменить: $3.$2.$1
5.7. Метасимволы - обратные ссылки
6. Модификаторы
Модификаторы служат для изменения режимов работы регулярных выражений.
Любой модификатор может располагаться внутри регулярного выражения с помощью специальной конструкции (. ).
Если эта конструкция расположена внутри подвыражения, то она действует только на это подвыражение.
Модификатор x заставляет игнорировать пробелы, табуляции и разделители строк, что позволяет форматировать текст выражения.
В совокупности эти возможности значительно улучшают читаемость регулярных выражений.
Читайте также: