суббота, 30 января 2010 г.

AutoIt3 и Регулярные выражения

Просматривая статистику входа в блог.
Довольно часто ко мне попадают по запросу "AutoIt3 Регулярные выражения".
Но, к сожалению, у меня нет информации на данный запрос.
Так что, думаю, пришла пора исправить эту ошибку, да и к тому же, оправдать ожидания :).

Раздумывая о том, где можно применить "Регулярные выражения" в AutoIt3, на ум ничего не приходит кроме заголовков окон.
Итак, давайте попробуем написать маленький скрипт, который будет по сочетанию клавиш, скажем "ctrl" + "shift" + "enter", сообщать текущее приложение и копировать в буфер название окна.
Итак, собственно с точки зрения работы с регулярными выражениями в AutoIt3 нет никаких сложностей. Существует 2 функции:
  • StringRegExp
  • StringRegExpReplace 
Думаю никаких сложностей они не вызовут. В  первой функции используется 2 обязательных параметра: 1й строка, 2й регулярное выражение. Почитать можно здесь. Во второй функции используется 3 обязательных параметра: 1й строка, 2й регулярное выражение, 3й строка замены совпадения. Почитать можно здесь.

Давайте посмотрим исходный скрипт и разберём его.
#Include <clipboard.au3> ;~ Импортируем бублиотеку для работы с буфером обмена

$myPattern = "(.*)-(.*)" ;~Зададим регулярное выражение.
HotKeySet("^+{Enter}", "ShowApplicationAndCopyName") ;~ Установим горячую клавишу для вызова нашего скрипта

Func ShowApplicationAndCopyName()
    ;~ Опишем тело процедуры которое будет получать текущее окно.
    $mytitle = WinGetTitle("[ACTIVE]") ;~ Получить текущее активное окно
    $myMatchArray = StringRegExp($mytitle, $myPattern, 1) ;~ Выполняем регулярное выражение, 3й параметр говорит что мы хотим получить массив совпадений
    If UBound($myMatchArray) > 0 Then ;~ Проверяем что бы совпадение что то нашло.
        MsgBox(0, "Active Windows is" , $myMatchArray[0]) ;~ Отображаем 1ое совпадение в диалоговом окне, т.е. имя открытого окна 
        _ClipBoard_SetData($myMatchArray[1]) ;~ Копируем в буфер 2ое совпадение, т.е. имя приложения
    Else  ;~ Если совпадения нет то просто отображаем заголовок
        MsgBox(0, "Active Windows is" , $mytitle) ;~ Отображаем весь заголовок, в диалоговом окне
        _ClipBoard_SetData($mytitle) ;~ Копируем в буфер весь заголовок
    EndIf
EndFunc

While 1
    ;~ Основное тело программы
    Sleep(100)
WEnd
Надеюсь скрипт понятен и дополнительных разъяснений не требуется.
С удовольствием отвечу на все вопросы.

2 комментария:

  1. Добрый день!

    Подскажите, пожалуйста, можно ли с помощью AutoIt сделать следующую операцию.

    У нас в буфере обмена содержится текст с вордовскими таблицами. Необходимо пройтись по этому тексту (в буфере обмена) регулярными выражениями и сделать замены. При этом структура таблиц не должна быть нарушена. Потом мы копируем из буфера измененный текст куда нам нужно.

    Возможно так сделать?

    ОтветитьУдалить
  2. Думаю, что возможно. Но никогда такой задачей не занимался.
    Судя по всему, вся задача заключается в получении буфера в переменную над которой будет применяться Регулярное выражение, и обработанное конвертирование.
    Возможно поможет функция BinaryToString(expr [, flag]) и StringToBinary("Hello")
    если ничего не получится пишите на почту попробую помочь.

    ОтветитьУдалить