§ 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
.
Задания
Grep1 балл
05 Найдите в файлах текущей и всех дочерних директорий все слова, которые начинаются с заглавной буквы. Для этого используйте команду grep
с нужным набором опций.
Sed1 балл
06 Найдите в файлах текущей директории все числа и замените их на такие же числа в скобках. Для этого используйте команду sed
с нужным набором опций.
Vim1 балл
07 Найдите в файле с исходным кодом все переменные с именем x
и переименуйте их в y
. Для этого используйте команду :s
в редакторе vim
. В регулярном выражении надо учесть границы слов.
C++2 балла
08 Напишите программу на C++, которая ищет в файлах строки, соответствующие переданному в нее в качестве аргумента регулярному выражению. Для чтения строк из файла используйте std::ifstream
и std::getline
, для регулярных выражений std::regex
.