Как использовать регулярное выражение для выполнения glob в C / C ++ (Linux) - PullRequest
4 голосов
/ 11 ноября 2010

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

По сути, мне нужна реализация для:

std::string getRexExpForGlob(const std::string& globPattern);

Обратите внимание, что эти совпадения не используются для файловой системы, поэтому POSIX glob не подходит.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

В зависимости от вашей ОС, у вас может быть <fnmatch> с int fnmatch(const char* pattern, const char* string, int flags).Это позволяет использовать шаблоны glob для произвольных строк и несколько дополнительных флагов, чтобы обеспечить гибкость, превышающую требуемую для сопоставления имен файлов.

В противном случае * и ? для glob эквивалентны регулярному выражению .* и .соответственно.(У глобусов также могут быть [] альтернативы, но вы сказали, что у других их нет).

2 голосов
/ 11 ноября 2010

* в шаблоне глобуса эквивалентно .* в регулярном выражении.? эквивалентно ..В большинстве диалектов регулярных выражений . не соответствует символу новой строки по умолчанию, поэтому, если вам нужно, чтобы он соответствовал этому символу, проверьте в своей библиотеке, как установить этот флаг.

1 голос
/ 11 ноября 2010

В регулярных выражениях . представляет любой отдельный символ. Это соответствует ? в шаблонах глобуса. Точно так же .* представляет любую последовательность символов, которая отображается на * в шаблонах глобуса. Вы должны быть в состоянии написать работоспособную функцию из этого.

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