2013-04-30 2 views
0

Использование PCRE из C, с учетом регулярного выражения/^ a {1,3} $/и строки «aa», pcre_dfa_exec() возвращает 1, указывая на то, что строка соответствует.PCRE open-end range & partial matching

Мне нужно, чтобы определить, что строка не исчерпывает регулярное выражение, и что есть место для последующих символов в строке, которая может потенциально также соответствовать (например, «111»).

Я не могу найти API для этого в PCRE. Я что-то упускаю?

+0

Не могли бы вы привести примеры других строк и какими должны быть результаты? – Barmar

+0

Все остальные правила должны совпадать с обычным соответствием. например, «b», «ab», «aaaa» не должны совпадать, «a», «aa» должны указывать, что они соответствуют, но не являются исчерпывающими, и «aaa» должен точно соответствовать. PCRE_PARTIAL почти делает это, за исключением того, что он считает, что «aa» является точным соответствием. –

+0

Это потому, что 'aa' является точным соответствием. Ваше регулярное выражение говорит, что оно соответствует 1, 2 или 3 а. Я не уверен, что вы подразумеваете под «, который потенциально может также совпадать». – Barmar

ответ

1

Вы не можете сделать это с помощью pcre или любого другого подходящего для регулярного выражения двигателя. Рассмотрим regexp a+, нет строки, для которой regexp исчерпан. Для большинства регулярных выражений существует бесконечное количество строк, которые будут соответствовать ему.

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

Вы можете использовать этот модуль perl: Regexp:Genexp Или использовать Python solution here.