Есть ли способ применить флаг FNM_PATHNAME для fnmatch только для первого экземпляра косой черты?

Привет, я пытаюсь придумать средство для маскирования подстановочных знаков с помощью fnmatch с определенными правилами.

при обнаружении первого экземпляра косой черты '/' в строке он должен точно совпадать с косой чертой ('/') в шаблоне. т.е. подстановочный знак ('*') не сможет соответствовать. Однако последующие косые черты во входной строке можно сопоставить с помощью подстановочного знака.

Например, для желаемого результата:

строка a / b / c должна быть сопоставлена ​​с помощью /. т.е. совпадает второй '/' после 'b', но не первая косая черта после 'a'.

строка: a / b / c шаблон: / Результат: совпадение. Поскольку в шаблоне для первого экземпляра '/' в str есть явный '/'

строка: a / b / c шаблон: * Результат: не совпадает. потому что нет явного '/' для первого экземпляра '/' в str

Я пробовал приведенную ниже часть кода, используя fnmatch

int match(char pat[], char str[])
{
   int rVal = fnmatch(pat, str, FNM_PATHNAME);
   return rVal;

}

-> Приведенный выше код с использованием флага FNM_PATHNAME успешно работает, если мне нужно сопоставить каждый '/' в строке с '/' в шаблоне. Но не в том случае, если мне нужно ограничить его только первым экземпляром.

-> Могу ли я продолжить работу над этим с помощью fnmatch или мне нужно полагаться на какие-либо другие функции posix. Пожалуйста помоги.

1 ответ

Решение

Нет, это невозможно сделать напрямую с помощью fnmatch, но вы можете просто разделить узор на две при первом / а затем разделите все строки кандидатов аналогичным образом на их первых /, и сопоставьте первую и вторую части отдельно.

Другие вопросы по тегам