Есть ли способ проверить синтаксис регулярных выражений с помощью кода C - PullRequest
0 голосов
/ 01 февраля 2019

Шаблон регулярного выражения:

enter image description here

Однако это недопустимый шаблон, так как синтаксис неправильный (должен быть предшествующий символ * в 2мест)

Правильный шаблон:

enter image description here

Есть ли способ проверить синтаксис этих шаблонов регулярных выражений в C-программировании?Любая библиотека или функция, которая будет оценивать вышеупомянутый неправильный шаблон и возвращать неверный шаблон?Я попытался использовать regcomp (но он не вернул неправильный шаблон для неправильного ввода)

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Существуют библиотеки регулярных выражений для c, которые вы можете использовать (см. Регулярные выражения в C: examples? ).Если вы хотите выяснить, имеет ли заданная строка допустимый формат регулярного выражения, вы можете сделать это с помощью другого регулярного выражения (см. Существует ли регулярное выражение для обнаружения действительного регулярного выражения? ), или вы можете попробовать«скомпилировать» строку как регулярное выражение.Я думаю, что первый путь - это более чистый путь.

0 голосов
/ 01 февраля 2019

Это зависит от используемой вами реализации регулярного выражения.Вот пример использования расширенных регулярных выражений POSIX, который просто проверяет возвращаемое значение regcomp и печатает сообщение об ошибке, полученное с помощью regerror:

#include <regex.h>
#include <stdio.h>
#include <string.h>

void test(const char *regex) {
&#9;regex_t preg;
&#9;int errcode = regcomp(&preg, regex, REG_EXTENDED);
&#9;if (errcode == 0) {
&#9;&#9;printf("%s => Success\n", regex);
&#9;&#9;regfree(&preg);
&#9;}
&#9;else {
&#9;&#9;char errmsg[80];
&#9;&#9;regerror(errcode, NULL, errmsg, 80);
&#9;&#9;printf("%s => %s\n", regex, errmsg);
&#9;}
}

int main() {
&#9;test("(*\\.com)");
&#9;test("(.*\\.com)");
&#9;return 0;
}

Попробуйте онлайн!

Это должно напечатать что-то вроде:

(*\.com) => Invalid preceding regular expression
(.*\.com) => Success

Обратите внимание, что (*\.com) является допустимым регулярным выражением POSIX basic , так как неэкранированный ( соответствуетбуквальный (.Для базовых регулярных выражений * в начале регулярного выражения или заключенного в скобки подвыражения также соответствует литералу *.

0 голосов
/ 01 февраля 2019

Возможно, вы захотите пойти за борт и сделать это в C с библиотекой или проверить эти инструменты живого тестирования https://regex101.com/ или https://www.debuggex.com/

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