API для добавления нескольких шаблонов с контекстом в регулярные выражения - PullRequest
1 голос
/ 19 февраля 2012

Я ищу библиотеку регулярных выражений, которая поддерживает API для добавления нескольких выражений ( шагов ), с контекстом для каждого; context [opaque] должен быть возвращен при использовании совпадение (чтобы я знал, какое выражение соответствует). Например:

re_t re;
int context = 1;
...
reg_add(re, "a{5}b", &context);
...
context = 2;
reg_add(re, "x(p|q)y", &context);
...
reg_match(re, mystring_subject, &context, &begin, &end); // <-- context returned among other info

Я посмотрел на Regex9 (plan9), Onig и PCRE, но не вижу таких API PCRE имеет возможность callout , но это должно быть добавлено к каждому выражению скомпилирован, и имеет ограничение 255. Кто-нибудь знает о какой-либо библиотеке регулярных выражений открытого домена который поддерживает API-интерфейсы этого типа, или любой простой в модификации lib для поддержки этого?

P.S. Я ищу библиотеку на основе C.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

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

Одним из решений, которое работает с любой библиотекой регулярных выражений, является объединение всех ваших регулярных выражений с использованием чередования и использование (именованных) групп захвата для определения того, какое регулярное выражение соответствует. В вашем примере вы можете объединить свои регулярные выражения в (?<context1>a{5}|b)|(?<context2>x(p|q)y). Когда это регулярное выражение находит совпадение, сопоставленный текст будет сохранен либо в группе захвата context1, либо в группе захвата context2.

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

0 голосов
/ 20 февраля 2012

Я не думаю, что эта "контекстная" логика является частью какой-либо библиотеки регулярных выражений, но вы можете запрограммировать ее самостоятельно. Вы должны хранить каждое из ваших регулярных выражений на карте (словарь) в качестве ключа, и соответствующее значение будет «контекстом» для этого конкретного регулярного выражения. Затем, когда вы сопоставляете входную строку, перебираете все записи на карте и, если найдете совпадение, возвращаете соответствующее значение «context». Это может быть заключено в модуль или класс и предоставить искомый API.

...