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

01 Регулярные выражения — это последовательности символов, представляющие шаблон поиска текста. В рамках теории формальных языков регулярные выражения являются регулярным языком, то есть множеством слов, которое может быть распознано конечным автоматом. В программах и скриптах регулярные выражения используются для извлечения из текста искомых частей (чисел, слов, частей слов и т.п.), а также для сопоставления текста с шаблоном. В командной строке их используют для извлечения нужной информации из вывода команды и для поиска в файлах нужных строк. В графических приложениях регулярные выражения применяются для поиска и замены строк в тексте. Таким образом, регулярные выражения — это универсальный инструмент для решения задач на разном уровне абстракции.

СимволОписание
.любой символ
[a-z]символ от a до z
[0-9]символ от 0 до 9
[0-9a-z]символ от 0 до 9 или от a до z
^начало строки (не символ)
$конец строки (не символ)
\bграница слова (не символ)
*предыдущий символ повторяется 0 или более раз
+предыдущий символ повторяется 1 или более раз
{3}предыдущий символ повторяется ровно 3 раза
{3,10}предыдущий символ повторяется от 3 до 10 раз
Символы в регулярных выражениях.

Командная строка

02 В командной строке для поиска строк внутри файлов, как правило, используется команда grep, а для поиска и замены — команда sed, однако для этих команд существуют более эффективные современные аналоги.

КомандаОписание
grep xyz file1найти строку xyz в файле file1
ps -eo pid,args | grep javaнайти процессы, содержащие java в названии или аргументе
sed -r -e 's/xyz/XYZ/g' file1найти и заменить все подстроки xyz на XYZ в файле file1
Примеры команд.

Vim

03 Регулярные выражения также используются в редакторах. Например, в Vim для поиска и замены строк используется команда :substitute, или сокращенно :s.

C++

04 Регулярные выражения также используются в языках программирования. В C++ они реализованы в классе std::regex.

#include <iostream>
#include <regex>

int main() {
  std::regex expr("xyz");
  std::string line("hello xyz");
  std::smatch match;
  if (std::regex_match(line, match, expr)) {
    std::cout << "Matches!\n";
  }
  return 0;
}
Регулярные выражения в C++.

Задания

Grep1 балл

05 Найдите в файлах текущей и всех дочерних директорий все слова, которые начинаются с заглавной буквы. Для этого используйте команду grep с нужным набором опций.

Sed1 балл

06 Найдите в файлах текущей директории все числа и замените их на такие же числа в скобках. Для этого используйте команду sed с нужным набором опций.

Vim1 балл

07 Найдите в файле с исходным кодом все переменные с именем x и переименуйте их в y. Для этого используйте команду :s в редакторе vim. В регулярном выражении надо учесть границы слов.

C++2 балла

08 Напишите программу на C++, которая ищет в файлах строки, соответствующие переданному в нее в качестве аргумента регулярному выражению. Для чтения строк из файла используйте std::ifstream и std::getline, для регулярных выражений std::regex.

./mygrep 'xyz' file
Пример запуска программы.

Видео

Запись лекции 04.12.2021.