fnmatch()

Проверить, соответствует ли имя файла (путь к файлу) заданному шаблону

Прототип:

#include <fnmatch.h>
int fnmatch( const char *pat,
const char *str,
int flags );

Аргументы:

pat
Шаблон для проверки.
str
Строка, которую нужно проверить на соответствие шаблону.
flags
Флаги, изменяющие интерпретацию pat и str; побитовое ИЛИ следующих битов:
FNM_PATHNAME
Если установлен, символ (/) в str явно соответствует символу (/) в pat; ему не соответствуют ни звездочка, ни вопросительный знак, ни выражение в скобках.
FNM_PERIOD
Если установлен, ведущая точка в str соответствует точке в pat, где определение “ведущая” зависит от FNM_PATHNAME:
  • Если FNM_PATHNAME установлен, точка является ведущей, если она является первым символом str или следует сразу за (/).
  • Если FNM_PATHNAME не установлен, точка является ведущей только если он является первым символом str.
FNM_QUOTE
Если не установлен, (\) в pat, за которой следует другой символ, соответствует второму символу. Если FNM_QUOTE установлен, (\) интерпретируется как обычный символ.

Библиотека:

libc

Описание:

Функция fnmatch() проверяет, соответствует ли имя или путь к файлу, определенное в аргументе str, шаблону, определенному аргументом pat.

Специальные символы сопоставления в шаблонах

Специальный символ сопоставления в шаблонах в кавычках - шаблон, совпадающий с самим специальным символом. Если символ не заключен в кавычки, он имеет специальное значение для шаблона. Специальные символы сопоставления в шаблонах и контексты, в которых они имеют особое значение, следующие:

?
Соответствует любому печатаемому и непечатаемому символу сопоставления, исключая <newline>.
*
Совпадает с любой строкой, включая пустую строку.
[bracket_expr]
Соответствует одному элементу сопоставления в соответствии с Regular Expression Bracket Expressions (1003.2 2.9.1.2) за исключением следующих моментов: Символы ?, * и [ не являются специальными, если находятся внутри скобочного выражения.

Объединение шаблонов, соответствующих одиночному символу, является корректным шаблоном, который соответствует объединению отдельных символов или элементов, совпадающих с каждым из объединенных шаблонов. Например, шаблон a[bc] соответствует строкам ab и ac.

Объединение одного или более шаблонов, соответствующих одиночному символу, с одной или болеее звездочек (*) явялется корректным шаблоном. В подобных шаблонах каждая звездочка соответствует строке из нуля или более символов, вплоть до первого символа, который соответствует символу, следующему за звездочкой в шаблоне. Например, шаблон a*d соответствует строкам ad, abd и abcd, но не строке abc.

Если звездочка является первым или последним символом шаблона, она соответствует нулю или более символов, которые предшествуют или следуют за символами, совпадающими с отсальной частью шаблона. Например, шаблон a*d* соответствует строкам ad, abcd, abcdef, aaaad и adddd; шаблон *a*d соответствует строкам ad, abcd, efabcd, aaaad и adddd.

Возвращаемое значение:

0
Аргумент str соответствует шаблону, определенному в pat.
≠0
Аргумент str не соответствует шаблону, определенному в pat.

Примеры:

/*
* The following example accepts a set of patterns
* for filenames as argv[1..argc]. It reads lines
* from standard input and outputs the lines that
* match any of the patterns.
*/
#include <stdio.h>
#include <fnmatch.h>
#include <stdlib.h>
#include <limits.h>
int main( int argc, char **argv )
{
int i;
char buffer[PATH_MAX+1];
while ( gets( buffer ) )
{
for ( i = 0; i < argc; i++ )
{
if ( fnmatch( argv[i], buffer, 0 ) == 0 )
{
puts( buffer );
break;
}
}
}
exit( EXIT_SUCCESS );
}

Классификация:

POSIX 1003.1

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

regcomp()




Предыдущий раздел: Описание API системной библиотеки