Регулярные выражения в Амиброкере

Опубликовано в AmiBroker

Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в Amibroker - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии Windows (начиная с Windows 98), и устанавливать дополнительно ничего не нужно.

 

Примеры использования на языке AFL:

//Поиск вхождений подстроки
 RegExp = CreateObject("VBScript.RegExp"); 
RegExp.IgnoreCase = False; //Игнорировать регистр
RegExp.Global = True; //Поиск всех вхождений шаблона
RegExp.MultiLine = False; //Многострочный режим

RegExp.Pattern = "<[^>]*>"; //Ищем теги HTML
Matches=RegExp.Execute("Это <hr> строка <br> с тегами HTML");
Count = Matches.Count;
str = "Найдены теги: ";
if (Count>0)
for(k = 0 ; k < Count ; k++)
{ Match = Matches.Item(k);
str += " " + Match.Value;
}
else
str = "Теги не найдены";
_N(Title = str);

Выдаст в окно:
Найдены тэги: <hr> <br>

 

Более продвинутый пример разбора HTML использует подвыражения (SubMatches) и позволяет находить как сами теги, так и текст между ними. 

 

//Поиск вхождений подстроки с использованием подвыражений
RegExp = CreateObject("VBScript.RegExp");

RegExp.IgnoreCase = False; //Игнорировать регистр
RegExp.Global = True; //Поиск всех вхождений шаблона
RegExp.MultiLine = False; //Многострочный режим

RegExp.Pattern = "([^<]*)(<[^>]*>)([^<]*)"; //Ищем теги HTML, а также текст до и после тега
Matches=RegExp.Execute(" <tr><td id=aaa>Дятел <td> долбит <td> сосну </tr>");
Count=Matches.Count;
if (Count>0)
{ str = "";
for (k = 0 ; k < Count ; k++)
{ Match = Matches.Item(k);
SubMatches = Match.SubMatches;
SubCount=SubMatches.Count;
for (n = 0 ; n < SubCount ; n++)
{ SubMatch=SubMatches.Item(n);
if (SubMatch=="")
continue;
str += "Подстрока: " + SubMatch + "\n";
}
}
}
else
str = "Вхождений шаблона не найдено";
_N(Title = str);

Выводит:

Подстрока: 
Подстрока: <tr>
Подстрока: <td id=aaa>
Подстрока: Дятел
Подстрока: <td>
Подстрока: долбит
Подстрока: <td>
Подстрока: сосну
Подстрока: </tr>

 Часто регулярные выражения используются для тестирования строк, например пользовательского ввода. Этот пример позволяет узнать, является ли строка целым числом. 

//Проверка подстроки
RegExp = CreateObject("VBScript.RegExp");
RegExp.Pattern = "^\\d+$"; //Шаблон, который соответствует целому числу. Символ "\" в AFL специальный, поэтому дублируется string="12345"; //Строка, которую тестируем if (RegExp.Test(string)==0)
   Title = "Это не целое число";
else
   Title = "Это целое число"; _N(Title);


Выдаст в окно:

Это целое число

 

Регулярные выражения поддерживают не только поиск, но и замену текста. При этом найденные подвыражения (в круглых скобках) могут быть представлены в строке замены как $1, $2 и т. д. 

//Строка, где мы будем производить замены
str="Дятел долбил сосну";
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = True; //Игнорировать регистр
RegExp.Global = True; //Поиск всех вхождений шаблона
RegExp.MultiLine = True; //Многострочный режим
RegExp.Pattern = "(долбил)";
Title=RegExp.Replace(str, "про$1");
_N(Title); 

Выдаст в окно:

Дятел продолбил сосну"

Более подробно о регулярных выражениях в Википедии.

В случае использования внешнего препроцессора вместе с AFL (статья AFL и препроцессор) регулярные выражения можно использовать также и на этапе сборки. Препроцессор M4 поддерживает регулярные выражения в стиле GNU Emacs.

Недостаточно прав для комментирования