Регулярные выражения в C - PullRequest
       7

Регулярные выражения в C

5 голосов
/ 07 апреля 2009

Мне любопытно, кто-нибудь знает хороший способ сопоставления регулярных выражений в C? Я могу думать только о Flex. Это единственный способ или есть лучший способ?

Спасибо!

Ответы [ 7 ]

13 голосов
/ 07 апреля 2009

Э-э ... Лучший способ -

#include <regex.h>

Это стандарт API POSIX для регулярных выражений.

Для не POSIX-систем переход на другую - одна из альтернатив, базовый движок регулярных выражений не слишком сложен для выполнения. Я уверен, что есть готовые решения, я не нуждаюсь в них.

Если подумать, думаю, у glib есть один.

11 голосов
/ 07 апреля 2009

В зависимости от того, какой диалект вы ищете и на какой платформе вы находитесь:

  • Регулярные выражения POSIX, вероятно, находятся в стандартной библиотеке C - см. и regcomp, regerror, regexec, regfree.
  • libPCRE предоставляет большинство расширенных возможностей регулярного выражения в Perl
  • Глеб имеет GRegex
  • Библиотека Генри Спенсера по Tcl Regex .

Генри Спенсер также создал библиотеку регулярных выражений , используемую в текущих версиях TCL и PostgreSQL. Это интересно, потому что это гибридная реализация NFA / DFA.

Регулярные выражения, которые принимают одну и ту же строку несколькими способами (например, * a?), По своей сути требуют NFA. Обычная реализация моделирует NFA как DFA, используя обратную трассировку, которая может достигать O (2 ^ длина (входная)) для особенно вырожденного паттерна. Но простая рекурсивная реализация может быть расширена за счет захвата, обратных ссылок, обратных вызовов к коду и всех обычных «дополнительных» функций, которые многие языки предлагают помимо тестирования на совпадения.

Подход "NFA" отслеживает несколько текущих состояний и обновляет их все с каждым входящим символом (см. Рецензию Росса Кокса на Thompson NFA regexes для более подробного объяснения). Этот подход - O (input.length * pattern.length), который работает быстрее - в очень худшем случае, что очень сложно, - но не может выполнять обратные ссылки или захваты, поскольку не отслеживает , как достигло состояние.

Подход Спенсера представляет собой гибрид, который компилирует некоторые части шаблона в подход NFA и использует возврат к исходному состоянию только в тех случаях, когда это необходимо для фактически запрошенных захватов. Зачастую это значительный выигрыш (см. Позицию TCL в перестрелке регулярных выражений ).

3 голосов
/ 07 апреля 2009

Посмотри это: http://www.pcre.org/

Это ОЧЕНЬ хорошая библиотека!

2 голосов
/ 07 апреля 2009
1 голос
/ 08 апреля 2009

Совершенно другой подход состоит в том, чтобы попробовать грамматику синтаксического анализа (PEG) . PEG сталкивается с проблемой сопоставления с образцом с точки зрения синтаксического анализатора и может даже использовать преимущества нескольких правил, образующих полную грамматику. Это позволяет писать выражения, соответствующие сбалансированным круглым скобкам, которые в других случаях довольно трудно выразить в большинстве диалектов регулярных выражений.

Хотя PEG относительно новы, должно быть несколько реализаций, которые можно использовать из C.

Я лично использовал реализацию PEG LPeg . Он аккуратно связан с Луа и по совпадению был написан одним из главных авторов Луа, Роберто Иерусалимским. Он обеспечивает полную реализацию PEG, а также содержит адаптер, который переводит регулярное выражение в эквивалентный PEG для выполнения.

Связывание ядра Lua с C-программой только для того, чтобы получить доступ к LPeg, может показаться излишним, но на самом деле это будет не так сложно, даже если вы не планируете использовать Lua для других целей.

0 голосов
/ 07 апреля 2009
0 голосов
/ 07 апреля 2009

Возможно эта статья поможет? Он показывает, как использовать функции регулярного выражения, определенные в regex.h.

Да, не регулярное выражение posix замечательно у них все это есть, поэтому я Интересно, почему они не в C? Что ж, Я нашел ответ, и я счастлив, они есть, и вот как использовать их

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...