Читаем Linux программирование в примерах полностью

pmatch[0] описывает часть строки, соответствующую всему регулярному выражению. Участок от pmatch[1] до pmatch[preg->re_nsub] описывает ту часть, которая соответствует каждому вложенному выражению в скобках. (Таким образом, вложенные выражения нумеруются начиная с 1.) Элементы rm_so и rm_eo не используемых элементов массива pmatch установлены в -1.

regexec() заполняет не более nmatch-1 элементов pmatch; поэтому следует убедиться, что имеется по крайней мере на 1 элемент больше, чем в preg->re_nsub.

Наконец, флаг REG_NOSUB для regcomp() означает, что начальная и завершающая информация не нужна. Этот флаг следует использовать, когда эти сведения не нужны; это потенциально может довольно значительно повысить производительность regexec().

Другими словами, если все, что вам нужно знать, это «соответствует ли?», включите REG_NOSUB. Однако, если нужно также знать, «где находится соответствующий текст?», этот флаг следует опустить.

В заключение, как regcomp(), так и regexec() возвращают 0, если они успешны, или определенный код ошибки, если нет. Коды ошибок перечислены в табл. 12.9.

Таблица 12.9. Коды ошибок regcomp() и regexec()

КонстантаЗначение
REG_BADBRСодержимое '\{...\}' недействительно.
REG_BADPATРегулярное выражение недействительно
REG_BADRPTСимволу ?, + или * не предшествует действительное регулярное выражение.
REG_EBRACEФигурные скобки ('\{...\}') не сбалансированы
REG_EBRACKКвадратные скобки ('[...]') не сбалансированы
REG_ECOLLATEВ шаблоне использован недействительный элемент сортировки
REG_ECTYPEВ шаблоне использован недействительный класс символов
REG_EESCAPEВ шаблоне есть завершающий символ \
REG_EPARENГруппирующие скобки ('(...)' или '\(...\)') не сбалансированы
REG_ERANGEКонечная точка в диапазоне не действительна
REG_ESPACEФункции не хватило памяти
REG_ESUBREGЦифра в '\цифра' недействительна
REG_NOMATCHСтрока не соответствует шаблону

Для демонстрации регулярных выражений ch12-grep.c предусматривает базовую реализацию стандартной программы grep, которая отыскивает соответствие шаблону. Наша версия использует по умолчанию базовые регулярные выражения. Для использования вместо этого расширенных регулярных выражений она принимает опцию -E, а для игнорирования регистра символов опцию -i. Как и настоящая grep, если в командной строке не указаны файлы, наша grep читает со стандартного ввода, а для обозначения стандартного ввода, как и в настоящей grep, может быть использовано имя файла '-'. (Эта методика полезна для поиска в стандартном вводе наряду с другими файлами.) Вот программа:

1  /* ch12-grep.c - Простая версия grep, использующая функции POSIX */

2

3  #define _GNU_SOURCE 1 /* для getline)) */

4  #include

5  #include

6  #include

7  #include

8  #include

9

10 char *myname; /* для сообщений об ошибках */

11 int ignore_case = 0; /* опция -i: игнорировать регистр */

12 int extended = 0; /* опция -E: использовать расширенные регулярные выражения */

13 int errors = 0; /* число ошибок */

14

15 regex_t pattern; /* шаблон для поиска */

16

17 void compile_pattern(const char *pat);

18 void process(const char *name, FILE *fp);

19 void usage(void);

Строки 10–15 объявляют глобальные переменные программы. Первый набор (строки 10–13) для опций и сообщений об ошибках. Строка 15 объявляет pattern, в которой хранится откомпилированный шаблон. Строки 17–19 объявляют другие функции программы.

21 /* main --- обработка опций, открывание файлов */

22

23 int main(int argc, char **argv)

24 {

25  int с;

26  int i;

27  FILE *fp;

28

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных