Книга: Windows Script Host для Windows 2000/XP

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

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

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


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

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

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

Символы Описание
  Следующий символ будет являться специальным символом или, наоборот, литералом. Например, n означает символ "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"
b Граница слова, т.е. позиция между словом и пробелом. Например, выражению erb соответствует символ "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+ " n";
}

В конце функции 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+"n";
  }
  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.723. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз