Поиск файлов с использованием регyлярных выражений

Поиск файлов с использованием регyлярных выражений

Всем хорошо известно, что для поиска файлов и папок с помощью стандартных средств Windows в именах можно использовать подстановочные символы "?" (обозначает любой один символ) и "*" (обозначает любое число любых символов). Например, на рис. 5.12 представлен результат поиска файлов *.sys (все файлы с расширением sys) на диске С:.

Рис. 5.12. Использование подстановочных символов при поиске файлов

В сценариях WSH можно производить поиск файлов (как и любого другого текста) с помощью гораздо более сложных правил для определения соответствий. Для этого используются регулярные выражения, которые определяют образец текста для поиска. Для задания этого образца используются литералы и метасимволы. Каждый символ, который не имеет специального значения в регулярных выражениях, рассматривается как литерал и должен точно совпасть при поиске. Метасимволы — это символы со специальным значением в регулярных выражениях. Описание наиболее часто используемых метасимволов приведено в табл. 5.14.

Таблица 5.14. Некоторые метасимволы, использующиеся в регулярных выражениях

Символы Описание
Следующий символ будет являться специальным символом или, наоборот, литералом. Например, n означает символ "n", а " " означает символ новой строки. Последовательности \ соответствует символ "", а ( — символ "("
^ Начало строки
$ Конец строки
* Предыдущий символ повторяется любое число раз (в том числе ни разу). Например, выражению zo* соответствуют как "z", так и "zoo"
+ Предыдущий символ повторяется не менее одного раза. Например, выражению zo+ соответствует "zoo", но не "z"
? Предыдущий символ повторяется не более одного раза
. (точка) Любой символ, кроме перевода строки
х|у Либо символ "х", либо символ "у". Например, выражению z|food соответствуют "z" или "food"
[xyz] Множество символов. Означает любой один символ из набора символов, заключенных в квадратные скобки. Например, выражению [abc] соответствует символ "а" в слове "plain"
[a-z] Диапазон символов. Означает любой один символ из заданного диапазона. Например, выражению [a-z] соответствует любая буква английского алфавита в нижнем регистре
[^m-z] Означает любой символ, не входящий в заданный диапазон. Например, выражению [^m-z] соответствует любой символ, не попадающий в диапазон символов от "m" до "z"
 Граница слова, т.е. позиция между словом и пробелом. Например, выражению er соответствует символ "er" в слове "never", но не в слове "verb"
В Позиция внутри слова (не на границе). Например, выражению еа*rB соответствует подстрока "ear" в "never early"
d Символ, обозначающий цифру. Эквивалентно [0-9]
D Любой символ, кроме цифры. Эквивалентно [^0-9]

Метасимволы можно употреблять совместно, например, комбинация ".*" означает любое число любых символов.

Замечание

Более подробную информацию о регулярных выражениях можно найти, например, в документации Microsoft по языку VBScript.

В качестве примера использования регулярных выражений в листинге 5.18 приведен сценарий FindRegExp.js, в котором производится поиск в подкаталоге ForFind текущего каталога всех файлов, имена которых начинаются с символов "П", "А" или "И" и имеют расширение txt.

Для получения доступа к каталогу ForFind в сценарии используется метод GetFolder объекта FileSystemObject:

//Создаем объект WshShell

WshShell=WScript.CreateObject("WScript.Shell");

//Создаем объект FileSystemObject

FSO=WScript.CreateObject("Scripting.FileSystemObject");

//Создаем объект Folder для доступа к подкаталогу ForFind

//текущего каталога

Folder = FSO.GetFolder(WshShell.CurrentDirectory+"\ForFind");

Поиск нужных файлов будет выполняться с помощью следующего регулярного выражения:

//Создаем регулярное выражение (объект RegExp)

RegEx=new RegExp("^[ПАИ].*.txt$", "i");

Сам поиск и вывод имен найденный файлов производятся в функции FindFilesInFolder(Fold, RegEx). Здесь сначала инициализируются счетчик найденных файлов и переменная, в которой будут сохраняться имена найденных файлов, а также создается объект Enumerator (переменная Files) для доступа к файлам каталога Fold:

ColFind=0; //Счетчик найденных файлов

SFileNames=""; //Строка с именами файлов

//Создаем коллекцию файлов в каталоге Fold

Files=new Enumerator(Fold.Files);

Элементы коллекции просматриваются в цикле while:

//Цикл по всем файлам в коллекции

while (!Files.atEnd()) {

 Files.moveNext(); //Переходим к следующему файлу

}

Для текущего файла в коллекции выделяется его имя, которое затем с помощью метода test объекта RegExp проверяется на соответствие заданному регулярному выражению:

//Выделяем имя файла

SName=Files.item().Name;

//Проверяем, соответствует ли имя файла регулярному выражению

if (RegEx.test(SName)) {

 ColFind++; //Увеличиваем счетчик найденных файлов

 //Добавляем имя файла к переменной SFileNames

 SFileNames+=SName+ " ";

}

В конце функции FindFilesInFolder(Fold, RegEx) на экран выводятся имена найденных файлов и их общее количество:

SItog="Найдено файлов: "+ColFind;

//Выводим на экран имена и количество найденных файлов

WScript.Echo(SFileNames+SItog);

Листинг 5.18. Поиск файлов, имена которых соответствуют регулярному выражению

/*******************************************************************/

/* Имя: FindRegExp.js                                              */

/* Язык: JScript                                                   */

/* Описание: Поиск файлов, имена которых соответствуют заданному   */

/*           регулярному выражению                                 */

/*******************************************************************/

//Объявляем переменные

var WshShell,FSO,Folder,ColFind,RegExp,SFileNames;

//Функция для поиска файлов в заданном каталоге

function FindFilesInFolder(Fold,RegEx) {

 var Files,SName; //Объявляем переменные

 ColFind=0; //Счетчик найденных файлов

 SFileNames=""; //Строка с именами файлов

 //Создаем коллекцию файлов в каталоге Fold

 Files=new Enumerator(Fold.Files);

 //Цикл по всем файлам в коллекции

 while (!Files.atEnd()) {

  //Выделяем имя файла

  SName=Files.item().Name;

  //Проверяем, соответствует ли имя файла регулярному

  //выражению

  if (RegEx.test(SName)) {

   ColFind++; //Увеличиваем счетчик найденных файлов

   //Добавляем имя файла к переменной SFileNames

   SFileNames+=SName+" ";

  }

  Files.moveNext(); //Переходим к следующему файлу

 }

 SItog="Найдено файлов: "+ColFind;

 //Выводим на экран имена и количество найденных файлов

 WScript.Echo(SFileNames+SItog);

}

/*******************  Начало  **********************************/

//Создаем объект WshShell

WshShell=WScript.CreateObject("WScript.Shell");

//Создаем объект FileSystemObject

FSO=WScript.CreateObject("Scripting.FileSystemObject");

//Создаем объект Folder для доступа к подкаталогу ForFind

//текущего каталога

Folder = FSO.GetFolder(WshShell.CurrentDirectory+"\ForFind");

//Создаем регулярное выражение (объект RegExp)

RegExp=new RegExp("^[ПАИ].*.txt$","i");

//Ищем файлы, имена которых соответствуют регулярному

//выражению RegExp в каталоге Folder

FindFilesInFolder(Folder,RegExp);

/*************  Конец *********************************************/

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Копирование файлов с использованием стандартной библиотеки С

Из книги автора

Копирование файлов с использованием стандартной библиотеки С Как видно из текста программы 1.1, стандартная библиотека С поддерживает объекты потоков ввода/вывода FILE, которые напоминают, несмотря на меньшую общность, объекты Windows HANDLE, представленные в программе


Копирование файлов с использованием Windows

Из книги автора

Копирование файлов с использованием Windows В программе 1.2 решается та же задача копирования файлов, но делается это с помощью Windows API, а базовые приемы, стиль и соглашения, иллюстрируемые этой программой, будут использоваться на протяжении всей этой книги.Программа 1.2. cpW:


Копирование файлов с использованием вспомогательной функции Windows

Из книги автора

Копирование файлов с использованием вспомогательной функции Windows Для повышения удобства работы в Windows предусмотрено множество вспомогательных функций (convenience functions), которые, объединяя в себе несколько других функций, обеспечивают выполнение часто встречающихся задач


Пример: последовательная обработка файлов с использованием метода отображения

Из книги автора

Пример: последовательная обработка файлов с использованием метода отображения Программа atou (программа 2.4) иллюстрирует последовательную обработку файлов на примере преобразования ASCII-файлов к кодировке Unicode, приводящего к удвоению размера файла. Этот случай является


Пример: преобразование файлов с использованием перекрывающегося ввода/вывода и множественной буферизации

Из книги автора

Пример: преобразование файлов с использованием перекрывающегося ввода/вывода и множественной буферизации Программа 2.4 (atou) осуществляла преобразование ASCII-файла к кодировке UNICODE путем последовательной обработки файла, а в главе 5 было показано, как выполнить такую же


Поиск на научных сайтах с использованием платформы Flexum «Поиск по научным сайтам»

Из книги автора

Поиск на научных сайтах с использованием платформы Flexum «Поиск по научным сайтам» Тема научного поиска не прошла мимо разработчиков персональных поисковиков. Подробному рассказу о возможностях таких поисковых систем посвящена отдельная глава нашей книги (см. главу 6).


Поиск файлов на FTP-серверах

Из книги автора

Поиск файлов на FTP-серверах FTP-серверы привлекательны тем, что обеспечивают возможность получать доступ непосредственно к файлам (без текстовой информации) и быстрее (чем по протоколу HTTP) загружать выбранные объекты на жесткий диск компьютера. Самое сложное в Интернете —


Поиск и закачка файлов

Из книги автора

Поиск и закачка файлов Теперь, когда мы познакомились с окном программы DC++, следует приступить к поиску и закачке понравившихся файлов.Как уже упоминалось ранее, загрузка файлов в сетях Direct Connect происходит напрямую с компьютера пользователя. Хаб является только


10.1.34. Поиск файлов и каталогов

Из книги автора

10.1.34. Поиск файлов и каталогов Ниже мы воспользовались стандартной библиотекой find.rb для написания метода, который находит один или более файлов и возвращает их список в виде массива. Первый параметр — это начальный каталог, второй — либо имя файла (строка), либо


Поиск с использованием подзапроса

Из книги автора

Поиск с использованием подзапроса Использование существующих предикатов в подзапросах- особенно предиката EXISTS О- обсуждалось в главе 21. Подзапросы могут также быть использованы другими способами в предикатах условий поиска в предложениях WHERE и


Поиск в содержимом файлов

Из книги автора

Поиск в содержимом файлов По умолчанию операционная система Windows Vista поддерживает возможность выполнения поиска в содержимом файлов со следующими расширениями: ASM, BAT, C, CMD, CPP, DIC, H, INF, INI, JAVA, LOG, M3U, MDB, RC, REG, SQL, TXT, VBS, WRI и т. д.Однако вы можете самостоятельно определить расширения


7.7. Поиск файлов

Из книги автора

7.7. Поиск файлов Для поиска файлов выполните команду главного меню Windows Пуск, Найти, Файлы и папки или нажмите Win+F — так будет быстрее. Вы увидите окно поиска (рис. 64). Помощник поиска предложит вам выбрать категории файлов, которые вы хотите найти. Если вы не собираетесь


4.4. Поиск файлов и папок

Из книги автора

4.4. Поиск файлов и папок Для поиска файлов нажмите <Win>+<F> и введите имя файла или папки. Вместо имени можно ввести маску (см. ранее). Второй способ: нажмите кнопку Пуск и в поле Найти программы и файлы введите имя файла (папки) или маску. Вы увидите результаты поиска. На


2.4.8. Поиск файлов и папок

Из книги автора

2.4.8. Поиск файлов и папок Иногда случается пренеприятная ситуация — предположим, писали вы что-то, или рисовали, или еще чего делали, сохранили ваши достижения на жесткий диск и… начисто забыли, в какой папке результаты ваших трудов лежат-покоятся. Диск большой, папок