Регулярные выражения в Амиброкере
Регулярные выражения (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.