Навигация по странице
Что такое регулярные выражения
Давайте начнем с ситуации, которая может возникнуть при подготовке курсовой работы или реферата. Представьте, что вы написали большую работу на пятьдесят страниц, и ваш научный руководитель просит вас составить список всех использованных источников из интернета. В тексте работы вы несколько раз ссылались на различные сайты, упоминали email-адреса авторов статей и организаций.
Проблема в том, что эти адреса разбросаны по всему документу. Где-то вы написали editor@future-step.ru, где-то info@kantiana.edu, где-то support@telegram.org. Всего таких адресов может быть несколько десятков, и все они разные.
Перед символом «@» стоят совершенно различные комбинации: имена, названия отделов, служебные обозначения. После «@» тоже разные домены: одни заканчиваются на «.ru», другие на «.com», третьи на «.org» или «.edu».
Как найти все эти адреса обычным поиском? Вы не можете просто искать конкретный адрес вроде «editor@future-step.ru», потому что это найдет только один адрес из всех.
Нельзя искать просто символ «@», потому что он может встречаться и в других контекстах. Нельзя искать окончание «.ru», потому что так вы пропустите адреса с «.org» и другими доменами.
Получается, что нужно искать что-то вроде «любой текст, затем собака, затем снова любой текст, затем точка и два-три символа в конце». Обычный поиск с такой задачей не справится.
Или другая типичная школьная ситуация. Вы готовите конспект по математике и набрали в документе множество чисел: результаты вычислений, константы, номера формул. Где-то стоит число 5, где-то 15, где-то 125, где-то 1005.
Теперь вам нужно найти все числа, которые оканчиваются на цифру 5. Как это сделать?
Если искать просто цифру 5, программа найдет вообще все пятерки, в том числе те, что стоят в начале или середине числа. Например, в числе 567 тоже есть пятерка, но оно не оканчивается на пять. Нужен способ сказать программе: «ищи пятерку, но только когда после нее сразу идет пробел или знак препинания, то есть число на этом заканчивается».
Еще пример из реальной жизни. Вы пишете отчет о проведенном опросе, и в документе встречаются номера телефонов респондентов. Кто-то указал телефон в формате «+7 (999) 123-45-67», кто-то просто «89991234567», кто-то «8 (999) 123 45 67» с пробелами.
Форматов много, но все это телефонные номера. Руководитель просит убрать из отчета все телефоны по соображениям конфиденциальности. Как их все найти, если они записаны по-разному?
Вот для решения таких задач и существуют регулярные выражения. Это способ описать не конкретный текст, который нужно найти, а шаблон, образец того, как этот текст должен выглядеть.
Вы говорите программе: «найди мне любую последовательность символов, которая начинается с букв, потом идет собака, потом снова буквы, потом точка и еще две-три буквы» – и программа понимает, что это описание email-адреса, и находит их все, какими бы разными они ни были по содержанию.
Регулярные выражения состоят из специальных символов, каждый из которых имеет особое значение. Эти символы позволяют описывать разные части шаблона: «любая цифра», «любая буква», «любой символ вообще», «начало слова», «конец строки» и так далее.
Научившись комбинировать эти специальные символы, вы сможете решать очень сложные задачи поиска и замены, которые обычным инструментом поиска решить просто невозможно.
Звучит сложно? На самом деле, если разобраться с каждым символом по отдельности, всё становится понятным. Давайте начнем с самых простых и постепенно перейдем к более сложным конструкциям.
Регулярные выражения в Writer
Прежде чем мы начнем разбирать специальные символы, важно понять, как включить режим работы с регулярными выражениями в LibreOffice Writer. По умолчанию этот режим выключен, и программа воспринимает всё, что вы вводите в поле поиска буквально как обычный текст.
Откройте окно «Найти и заменить» привычным способом – нажмите «Ctrl+H». В открывшемся окне найдите раздел «Другие параметры». Если он свернут, щелкните по нему, чтобы развернуть. Среди различных опций вы увидите чекбокс с названием «Регулярные выражения». Поставьте в нем «галочку».
Как только вы это сделаете, произойдет важное изменение: теперь текст, который вы вводите в поле поиска, будет интерпретироваться не как обычные символы, а как шаблон с использованием специальных обозначений.
Обратите внимание, что некоторые другие опции (например, «Слова целиком» или «Поиск подобных») станут неактивными – они несовместимы с регулярными выражениями, потому что регулярные выражения сами по себе настолько гибкие, что включают в себя возможности этих опций и даже больше.
Теперь мы готовы изучать специальные символы регулярных выражений. Начнем с самых базовых и постепенно перейдем к более продвинутым конструкциям.
Точка (.) – любой одиночный символ
Начнём с самого универсального символа в регулярных выражениях. Представьте, что вы работаете над документом совместно с несколькими вашими друзьями. И так случилось, что вы не договорились, как обозначать время в тексте:
- Через двоеточие «16:00»
- Через точку «16.00»
- Через дефис «16-00»
- Или вообще через пробел «16 00»
В итоговом документе все-таки хочется, чтобы время везде имело одинаковое написание. Но как в тексте найти все эти форматы написания времени?
Для этого можно использовать символ точки «.», который заменяет один любой символ в выражении. Соответственно, нам нужно заменить точкой символ между шестёркой и нулём. Значит, в строке поиска запишем такое выражение «16.00». Да, очень похоже на второй вариант записи времени, но все же, при наличии «галочки» на пункте «Регулярные выражения» мы будем искать именно любой символ вместо точки.
Отлично, под наш шаблон подошли все необходимые форматы времени. Теперь запросто можем привести их к одному виду, используя замену.
Да, такой записью мы нашли только одно конкретное время с точностью до минуты. Но, как и говорилось ранее, мы можем в шаблоне для поиска задавать любые возможные параметры. В том числе можно указывать не точное время, а просто шаблон «две цифры двоеточие две цифры». Это достигается с помощью диапазонов символов, но к ним мы перейдём немного позже.
А пока давайте для закрепления рассмотрим еще один пример. Вы ведете список задач для учебного проекта и нумеруете их как «№1», «№2», «№3» и так далее. Но иногда вместо символа номера вы по ошибке ставили латинскую заглавную букву N или строчную n. Получается, где-то написано «№7», где-то «N7», где-то «n7».
Чтобы найти все эти варианты одним поиском, можно использовать шаблон «.7» – любой символ, за которым следует цифра 7. Программа найдет все три варианта.
Однако будьте осторожны: такой шаблон найдет вообще любой символ перед семёркой, в том числе и те случаи, которые вам могут быть не нужны.
Например, если в тексте встретится «а7» или «Z7», они тоже попадут в результаты. Поэтому точку обычно комбинируют с другими, более точными спецсимволами, чтобы сузить круг поиска. Но для начала важно понять сам принцип: точка означает «любой символ на этой позиции».
Причем не просто любой, а один любой символ! Давайте еще один пример рассмотрим. Вы работаете с датами в конспекте по истории. Допустим, нужно найти все даты 20-го века, оканчивающиеся на 5. Например, в тексте «1905 19995 1985 1945» нам подойдут: «1905», «1985» и «1945», но не «19995».
В таком случае можно использовать шаблон «19.5».
Здесь строка «19995» не подходит как раз потому, что между «19» и «5» должен быть ровно один символ! Если же требуется вставить в шаблон более одного любого символа, то нужно использовать несколько точек или специальные квантификаторы, о которых мы поговорим позже.
Экранирование специальных символов
Из предыдущего раздела возникает логичный вопрос: а что делать, если нужно найти именно точку, а не использовать ее как специальный символ?
Представьте ситуацию: вы пишете реферат по информатике и упоминаете названия файлов. Например, «document.txt», «photo.jpg», «archive.zip». Вам нужно найти все упоминания файлов с расширением «.txt», то есть найти именно сочетание «.txt» с точкой в начале.
Если вы просто введете в поиск «.txt», программа поймет точку как «любой символ», и найдет не только «.txt», но и «atxt», «1txt», «ztxt» и любые другие комбинации из одного символа и букв «txt».
Это не то, что нам нужно. Нужен способ сказать программе: «здесь точка – это именно точка, обычный символ, а не специальное обозначение».
Для этого в регулярных выражениях используется обратный слеш, который называется символом экранирования. Когда вы ставите обратный слеш перед специальным символом, вы как бы отменяете его специальное значение и говорите программе: «воспринимай следующий символ буквально».
Чтобы найти файлы с расширением .txt, нужно написать «.txt» – обратный слеш «\», затем точка, затем txt – «\.txt». Теперь программа будет искать именно точку, а не любой символ.
Давайте рассмотрим более развернутый пример. Вы готовите список литературы для курсовой работы и ссылаетесь на интернет-источники. В вашем документе встречаются адреса сайтов: «www.future-step.ru», «www.telegram.org», «www.google.com». Вам нужно найти все адреса, начинающиеся с «www.» – именно с этих четырех символов, включая точку после «www».
Если написать в поиске «www.», точка в конце будет означать любой символ, и шаблон найдет не только «www.», но и, например, «wwwa» или «www5», если такое случайно окажется в тексте. Правильный шаблон – «www\.» – здесь точка экранирована обратным слешем и воспринимается буквально.
Важно запомнить: обратный слеш используется для экранирования не только точки, но и любых других специальных символов регулярных выражений, когда вам нужно найти их как обычные символы.
Например, символы вопросительного знака (?), звездочки (*), плюса (+), квадратных скобок ([]), круглых скобок (()), фигурных скобок ({}) и многие другие имеют в регулярных выражениях специальное значение. Если вам нужно найти их буквально, ставьте перед ними обратный слеш.
Можно запомнить простое правило: если сомневаетесь, является ли символ специальным, и хотите найти его буквально – ставьте перед ним обратный слеш. Для обычных букв и цифр это не нужно, а вот для знаков препинания и специальных символов лучше перестраховаться.
Звездочка (*) – 0 или более повторений
Далее мы рассмотрим целый класс из трёх символов. Они называются квантификаторами и указывают, сколько раз может повторяться предыдущий символ или группа символов. Начнем со звездочки, которая означает «ноль или более повторений».
Представьте, что вы готовите статью для школьной газеты и несколько раз упоминаете восклицание «Ура!». Но в разных местах вы написали это по-разному: где-то просто «Ура!», где-то эмоционально «Урааааа!», где-то очень уж эмоционально «Ураааааааа!» – с разным количеством букв «а». Количество этих букв может быть любым: две, пять, десять.
Теперь представим, что наша школьная газета для грустных и в ней нет места каким-то восклицаниям и радости. Шеф-редактор потребовал все ваши «Ураа!» заменить на простое и лаконичное «Ура.». Что же, искать по всей статье вручную каждое восклицание?
Нет, конечно, просто воспользуемся поиском и заменой с регулярными выражениями. Давайте думать, какой шаблон здесь составить. У нас идут буквы «Ура» далее какое-то любое количество букв «а» и заканчивается все это восклицательным знаком. Первые три буквы оставляем как есть, равно как и восклицательный знак. А неизвестное количество букв «а» мы зашифруем символом «*». Получаем такой шаблон: «Ура*!»
Под шаблон подходят все нужные слова, можем смело их заменять.
Подметим важный момент: звездочка относится только к символу, который стоит непосредственно перед ней. В нашем примере звездочка стоит после буквы «а», поэтому повторяться может только эта буква.
Если бы мы написали «Ур*а!», это означало бы «буква У, затем буква р (которая может повторяться ноль или более раз), затем буква а и восклицательный знак». Такой шаблон нашел бы «Уа!» (ноль букв р), «Ура!» (одна буква р), «Урра!» (две буквы р) и так далее.
На практике звездочка очень часто используется в комбинации с точкой. Сочетание «.*» означает «любой символ, повторяющийся любое количество раз», то есть по сути «любая последовательность любых символов». Это очень мощная, но и опасная конструкция, потому что она может захватить слишком много текста.
Например, представьте, что в вашем конспекте есть фразы в кавычках: «первая цитата» и дальше по тексту «вторая цитата». Если вы хотите найти текст в кавычках и напишете шаблон ««.*»«, программа найдет всё от первой открывающей кавычки до последней закрывающей, включая текст между цитатами! То есть найдется: «первая цитата» и дальше по тексту «вторая цитата» – всё целиком, как один большой фрагмент.
Это называется «жадное» поведение квантификаторов – они захватывают максимально возможное количество символов. Есть способы сделать поиск «ленивым», но об этом позже.
Плюс (+) – 1 или более повторений
Плюс работает очень похоже на звездочку, но с одним важным отличием: он требует, чтобы предыдущий символ встретился хотя бы один раз. Звездочка допускает ноль повторений (то есть символ может вообще отсутствовать), а плюс требует минимум одно вхождение.
Давайте разберем это на примере. Вы готовите отчет о социологическом опросе и записываете ответы респондентов. Кто-то отвечал односложно: «Да», кто-то более эмоционально: «Дааа», а кто-то совсем восторженно: «Дааааааа».
Вам нужно найти все такие ответы, но при этом не находить просто букву «Д», если она случайно стоит отдельно в начале какого-то слова. Для этого напишем шаблон «Да+».
Да, работа знака «+» очень похожа на звёздочку. И даже в том примере с «Ураа» логичней было бы использовать плюс. По-настоящему эти квантификаторы раскрываются при работе с диапазонами значений. Но до них мы дойдём немного позже.
А пока запомните разницу: звездочка (*) – это «может быть, а может не быть, а может быть много», плюс (+) – это «обязательно есть хотя бы один, а может быть и много».
Вопросительный знак (?) – ноль или одно повторение
Это самый «скромный» из квантификаторов. Он означает, что предыдущий символ может встретиться либо ноль раз (то есть вообще отсутствовать), либо ровно один раз. Больше одного раза – уже не подходит.
Вы же знаете отличия в написании слова «цвет» в английском языке? В британском варианте это слово пишется как «colour», тогда как в американском – «color», без буквы «u».
Как же быть, если у нас в тексте смешались оба варианта написания? Для этого можем указать, что буква «u» может встречаться в слове 0 или 1 раз: «colou?r».
Вопросительный знак очень полезен для работы с необязательными элементами. Например, в конспекте по физике встречаются записи единиц измерения: иногда вы пишете «5кг» (без пробела), иногда «5 кг» (с пробелом).
Чтобы найти оба варианта, используйте «5 ?кг» – цифра 5, затем пробел с вопросительным знаком (может быть, может не быть), затем буквы «кг». Программа найдет и «5кг», и «5 кг».
Фигурные скобки ({}) – точное количество повторений
До сих пор мы использовали квантификаторы, которые задают заранее определённое количество повторений: «*» (0 или более), «+» (1 или более), «?» (0 или 1).
Но иногда нужно указать любое другое желаемое количество повторений или определенный диапазон. Для этого используются фигурные скобки.
Представьте, что вы проверяете правильность записи телефонных номеров в вашем документе. Современные российские мобильные номера состоят из 11 цифр и обычно начинаются с 8 или +7. После кода оператора (три цифры) идет номер абонента (семь цифр). Например: «89991234567».
Чтобы найти все такие номера, нужно искать именно 11 цифр подряд, не больше и не меньше. Шаблон «[0-9]{11}» означает: любая цифра от 0 до 9, повторенная ровно 11 раз. Это найдет только последовательности из одиннадцати цифр, ни из десяти, ни из двенадцати.
Но для определения номера (с +7) точнее подойдёт следующий шаблон: «\+7[0-9]{10}» (не забывайте про экранирование плюса)
Фигурные скобки могут задавать не только точное количество, но и диапазон. Синтаксис такой:
- {n} – ровно n повторений
- {n,} – n или более повторений
- {n,m} – от n до m повторений включительно
Рассмотрим практический пример. Вы пишете конспект по химии, где упоминаются химические элементы. Их обозначения состоят из одной или двух латинских букв: H (водород), He (гелий), Na (натрий), и так далее.
Чтобы найти все такие обозначения, можно использовать «[A-Z][a-z]{0,1}» – заглавная латинская буква, затем строчная латинская буква, которая может встретиться от 0 до 1 раза (то есть может быть, а может не быть).
Комбинируя фигурные скобки с другими элементами регулярных выражений, можно создавать сложные шаблоны. Например, российский паспорт имеет серию (четыре цифры) и номер (шесть цифр), которые часто записывают через пробел: «1234 567890». Шаблон «[0-9]{4} [0-9]{6}» найдет все такие записи – четыре цифры, пробел, шесть цифр.
Квадратные скобки – диапазон символов
Теперь познакомимся с очень важной конструкцией – диапазонами символов. Квадратные скобки позволяют указать набор символов, любой из которых может находиться на данной позиции. Это как множественный выбор: «на этом месте может быть либо А, либо Б, либо В».
Например, слово «кеш», обозначающее промежуточное хранилище данных в компьютерных системах, может писаться как через «е», так и «э». Поэтому для поиска в тексте необходимо указать сразу две возможные буквы между «к» и «ш». Это можно сделать, перечислив их в квадратных скобках: «к[еэ]ш». Такая запись найдёт как «кеш», так и «кэш».
Квадратные скобки особенно удобны для работы с цифрами. Допустим, в вашем расписании занятий вы отметили важные уроки цифрами: 1 – математика, 2 – физика, 3 – химия. Вам нужно найти все уроки математики и физики (под номерами 1 и 2), но не химию (под номером 3). Шаблон «[12]» найдет либо цифру 1, либо цифру 2 в тексте.
Очень часто нужно указать не отдельные символы, а диапазон. Например, любую цифру от 0 до 9. Писать «[0123456789]» долго и неудобно. Вместо этого можно использовать дефис для обозначения диапазона: «[0-9]» – это означает «любая цифра от 0 до 9 включительно».
Аналогично работает и для букв. Шаблон «[a-z]» означает любую строчную латинскую букву. А «[A-Z]» – любую заглавную латинскую букву. С кириллицей немного аналогично: «[А-Я]», соответственно, строчные – «[а-я]».
Эти диапазоны можно объединять. Например, весь русский алфавит в обоих регистрах записывается так: «[А-Яа-я]».
Давайте для примера найдём в тексте все двухбуквенные слова, оканчивающиеся на букву «ж». Это можно сделать такой записью: «[А-Яа-я]ж».
Без включенного параметра учёта регистра можно использовать запись только в одном регистре, например, «[а-я]»!
Важная деталь: внутри квадратных скобок большинство специальных символов теряют свое особое значение и воспринимаются буквально. Например, точка внутри скобок – это просто точка, а не «любой символ». Если вы напишете «[.,!?]», это означает «либо точка, либо запятая, либо восклицательный знак, либо вопросительный знак» – то есть любой знак препинания из перечисленных, экранировать их не требуется!
Исключение символов из диапазона (^)
Внутри квадратных скобок есть специальный символ – каретка или циркумфлекс (^), который превращает класс символов в отрицание. Если поставить «^» в самом начале внутри квадратных скобок, класс будет означать «любой символ кроме перечисленных».
Представьте, что вы проверяете, правильно ли оформлены номера в нумерованном списке. После номера должна стоять точка или закрывающая скобка. Шаблон «[0-9][^.)]» найдет все места, где после цифры стоит что-то другое, а не точка или скобка. Это помогает быстро найти ошибки оформления.
Допустим, вы пишете программу на Python в рамках курса информатики и хотите найти все места, где после знака равенства стоит не пробел. По правилам PEP8 после знака равно должен быть пробел: «x = 5», а не «x =5». Шаблон «=[^ ]» (знак равенства, затем диапазон символов «любой символ кроме пробела») поможет найти нарушения этого правила.
Важный нюанс: символ «^» работает как отрицание только когда стоит в самом начале внутри квадратных скобок. Если «^» стоит в любом другом месте внутри скобок, он воспринимается как обычный символ каретки.
Например, «[а^я]» означает «либо буква а, либо символ ^, либо буква я», а не «любая буква кроме а и я».
Вертикальная черта (|) – альтернатива
Символ вертикальной черты позволяет задать альтернативу: «либо это, либо то». Это как логическое ИЛИ в программировании. Шаблон «А|Б» означает «либо А, либо Б».
При этом, запись «[АБ]» будет равнозначна такой «А|Б». Так что вертикальная черта используется именно для альтернативной записи целых слов, а не символов.
Так, например, представьте, что вы пишете сочинение по литературе и упоминаете двух авторов: Пушкина и Лермонтова. Вам нужно найти все места, где упоминается любой из этих авторов. Вместо двух отдельных поисков можно использовать один шаблон: «Пушкин|Лермонтов» – это найдет либо слово «Пушкин», либо слово «Лермонтов», либо оба, если они встречаются в разных местах документа.
Давайте разберем еще один практический пример. Вы проверяете документ, где должны быть указаны города: Москва, Санкт-Петербург или Калининград. Чтобы быстро найти все упоминания этих городов одним поиском, используйте: «Москва|Санкт-Петербург|Калининград» – можно перечислить сколько угодно альтернатив через вертикальную черту.
Начало и конец строки (^ и $)
Теперь познакомимся с особой группой символов, которые называются якорями. Они не обозначают какие-то конкретные символы в тексте, а указывают на позицию в строке. Символ каретки «^», когда он стоит вне квадратных скобок, означает начало строки. Символ доллара «$» означает конец строки.
Представьте, что вы пишете конспект на компьютере, где каждый новый пункт плана начинается с цифры и точки: «1. Введение», «2. Основная часть», «3. Заключение» и так далее.
Но в тексте могут встречаться цифры с точками и в других местах, например, «в пункте 1. было сказано». Вам нужно найти именно номера пунктов, которые стоят в начале строки, а не любые цифры с точками в тексте.
Шаблон «^[0-9]». означает: начало строки (^), затем любая цифра от 0 до 9, затем точка. Этот шаблон найдет только те цифры с точками, которые стоят в самом начале строки. Цифры, встречающиеся в середине предложений, найдены не будут.
Рассмотрим обратную ситуацию – поиск по концу строки. Вы проверяете правильность оформления предложений и хотите убедиться, что все они заканчиваются знаками препинания. Шаблон «[.,!?]$» найдет все знаки допустимые в вашем тексте знаки препинания, которые находятся в конце строки. Символ «$» в конце означает «конец строки».
Важное замечание: понятие «строки» в контексте регулярных выражений означает текст между символами переноса строки. Когда вы нажимаете Enter в документе, создается новая строка.
Якорь «^» привязывается к позиции сразу после переноса строки (или к самому началу документа), а якорь «$» – к позиции прямо перед переносом строки (или в самом конце документа).
Границы слов ()
Если честно, то некоторые из приведённых выше примеров не совсем корректно работали бы в настоящем тексте. Все дело в том, что с квантификаторами или диапазонами у нас находилось бы не только нужно слово, например, из 2 латинских букв, но и вообще любая последовательность латинских букв. Только она разбивалась бы на группы по 2 символа.
Все дело в том, что до этого мы не указывали границу слова!
Последовательность «\b» (обратный слеш и латинская буква b) означает границу между словом и не-словом. Это может быть пробел, знак препинания, начало или конец строки – любое место, где слово начинается или заканчивается.
Вернёмся к нашему примеру с химическими элементами.
Вам не кажется, что последняя строка не совсем нам подходит?
Давайте это исправлять. Мы хотим, чтобы до заглавной латинской буквой и после от 0 до 1 строчной латинской буквой стояла граница слова. То есть нужное нам слово должно быть справа и слева ограничена пробелом, началом строки, знаком препинания и так далее.
Для этого поставим в начало и конец нашего шаблона последовательность «\b»: «\b[A-Z][a-z]{0,1}\b».
То есть эта последовательность «\b» – некий аналог пропавшего пункта «Слова целиком».
Вспомним еще ситуацию с поиском телефонного номера. Да, представленный ранее шаблон «\+7[0-9]{10}» хорошо найдёт любые номера, состоящие из 12 символов. Но под этот шаблон также подойдёт любая последовательность цифр, начинающаяся с «+7» и содержащая далее 10 и более цифр.
Из всех строк, представленных выше, нам подходят только первая и третья – только они выглядят как корректные телефонные номера. Чтобы найти только эти значения, расставим слева и справа от шаблона последовательность «\b»: «\b\+7[0-9]{10}\b».
Рассмотрим еще один классический пример. В тексте вам нужно найти все слова, оканчивающиеся на «-со». Да, таких слов немного (всего четыре), но не будем же мы искать каждое слово вручную?
Можем смело предположить, что нам подходят слова по такому шаблону: «одна и более букв кириллицы, после которых две буквы со»: «[а-я]+со». Но, как мы видим, по такому шаблону находятся даже те слова, в которых «со» стоит где-то внутри слова, а не в конце.
Если же мы хотим, чтобы «со» было именно в конце слова, следует справа от шаблона поставить «\b». В таком случае найдутся только 4 нужных слова.
Группировка и захват – круглые скобки ()
Теперь перейдем к одной из самых интересных возможностей регулярных выражений – группировке и захвату частей текста. Круглые скобки позволяют объединить несколько символов в одну группу и затем работать с этой группой как с единым целым. Более того, захваченные в скобки фрагменты можно потом использовать при замене.
Начнем с простого примера группировки. Представьте, что вы ищете в своем конспекте по биологии упоминания о ДНК. Это может быть написано по-разному: «ДНК», «ДНК-анализ», «анализ ДНК» и так далее. Если нам нужно найти слово «ДНК», за которым может идти дефис и еще какое-то слово, можно использовать группировку.
Шаблон «ДНК(-[а-я]+)?» означает следующее: «буквы «ДНК», затем необязательная группа (в круглых скобках), которая состоит из дефиса и одного или более строчных букв». Вопросительный знак после закрывающей скобки означает, что вся эта группа может присутствовать, а может отсутствовать (0 или 1 повторение). Такой шаблон найдет и просто «ДНК», и «ДНК-анализ», и «ДНК-структура».
Без группировки, если бы мы написали «ДНК-[а-я]+?», вопросительный знак относился бы только к последней букве из диапазона «[а-я]», а не ко всей конструкции «дефис и слово». Скобки позволяют применить квантификатор (в данном случае «?») ко всей группе символов целиком.
Теперь перейдем к более интересной возможности – захвату и повторному использованию. Когда вы заключаете часть шаблона в круглые скобки, программа запоминает, что именно было найдено в этой части, и присваивает этому фрагменту номер.
Первая пара скобок получает номер 1, вторая – номер 2, и так далее. Эти захваченные фрагменты можно использовать при замене, обращаясь к ним, как $1, $2 и т.д.
Представьте, что вы пишете отчет о проекте, где часто упоминаете даты в формате «15.03.2024» («день.месяц.год»). Вам нужно изменить формат на американский: «03/15/2024» («месяц/день/год»). То есть нужно поменять местами день и месяц, а также заменить точки на слеши.
Шаблон для поиска: «([0-9]{2}).([0-9]{2}).([0-9]{4})» – давайте разберем его по частям:
- ([0-9]{2}) – первая группа: ровно две цифры (день)
- . – точка (экранированная)
- ([0-9]{2}) – вторая группа: ровно две цифры (месяц)
- . – еще одна точка
- ([0-9]{4}) – третья группа: ровно четыре цифры (год)
В поле «Заменить» пишем: «$2/$1/$3» – вторая группа (месяц), слеш, первая группа (день), слеш, третья группа (год). Программа выполнит замену, переставив день и месяц местами и изменив разделители.
Еще один практический случай: вы оформляете список литературы, где фамилия и инициалы автора написаны в одном порядке: «Толстой Л.Н.». Нужно изменить порядок на «Л.Н. Толстой» (сначала инициалы, потом фамилия).
Шаблон для поиска: «([А-Я][а-я]+) ([А-Я]\.[А-Я]\.)» – заглавная буква и строчные (фамилия) в первой группе, пробел, затем инициалы во второй группе.
В поле «Заменить»: «$2 $1» – вторая группа (инициалы), пробел, первая группа (фамилия).
На этом мы закончим рассмотрение работы с регулярными выражениями в LibreOffice Writer. В следующих статьях научимся применять полученные навыки для решения 10 заданий ЕГЭ по информатике.