Использование fnmatch со сложным шаблоном C - PullRequest
0 голосов
/ 29 мая 2018

Я могу сопоставить простой шаблон, например: "[0-9]", с

fnmatch("[0-9]", tocheck, 0)

, но если мне дано что-то более сложное?или же .или даже комбинация из них, как я могу использовать fnmatch?Я видел, что есть некоторые флаги, которые могут сделать трюк, но я не знаю, как использовать, потому что я довольно плохо знаком с C.

РЕДАКТИРОВАТЬ: я видел ответ с просьбой дать более подробную информацию:

#include <stdio.h>
#include <fnmatch.h>

int main (int argc, char** argv){
 const char* patternOne = "[0-9]";
 const char* patternTwo = ".?[a-z0-9]*?*[a-z0-9]";
 int res = fnmatch(patternTwo, "0", 0);
 printf("Result: %d\n",  res);
}

Если я использую patternOne, результатом будет 0 (и если я изменю строку, чтобы соответствовать, результат изменится правильно).Однако если я использую patternTwo, я никогда не получу «Result: 0» для какой-либо строки, которую я передам fnmatch.Мне нужно сопоставить что-то подобное в моей программе (это для экзамена в университете, поэтому схемы очень сложны)

1 Ответ

0 голосов
/ 01 июня 2018

Рассматривайте шаблон как шаблон оболочки.Дано:

const char* patternTwo = ".?[a-z0-9]*?*[a-z0-9]";

Нет способа, которым "0" будет соответствовать этому.Пример строки, которая будет соответствовать ей: ".XaX9"

. совпадений .
X совпадений ?
a совпадений [a-z0-9]
X соответствует *?*
9 соответствует [a-z0-9]

Причина fnmatch() отличается от glob() в том, что шаблон "*" (который, как обычный глобус, будет соответствовать любой строке) не будет соответствовать файлу с именем ".profile", поскольку точечные файлы рассматриваются как скрытые (это функция, предназначенная для сопоставления имени файла).

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