1

Тема: AHK: Regex, поиск буквы m в заголовке

Здравствуйте, есть код

#NoTrayIcon
#SingleInstance, force
DetectHiddenWindows, on
sleep, 64000
winclose, ahk_class uTorrent Helper
sleep, 3000
Process, close, uTorrentHelper.exe
WinGetTitle, OutputVar, ahk_class µTorrent4823DF041B09
var := RegExReplace(OutputVar, ".*?(\d+).*", "$1")
if var < 10
{
sleep 128000
WinGetTitle, OutputVar, ahk_class µTorrent4823DF041B09
var1 := RegExReplace(OutputVar, ".*?(\d+).*", "$1")
if var1 < 10
{
WinMenuSelectItem, ahk_class µTorrent4823DF041B09,, Файл, Выход
return
}
}
return

регех ищет первую цифру, нужно ещё добавить чтобы искал букву m, как это сделать?

Код замечательно работал пока не повысил скорость интернета, и скорость в заголовке уторента начала писаться не в кб а в мб. Теперь критерий < 10 не подходит, так как 1 мб и 1 кб меньше 10, но в первом случае означает закачка идёт во втором закончилась. Помогите пожалуйста решить вопрос.

2

Re: AHK: Regex, поиск буквы m в заголовке

А как у вас заголовок выглядит? Приведите пример.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Regex, поиск буквы m в заголовке

1.08 М/2.61 К — µTorrent 3.2.3

4

Re: AHK: Regex, поиск буквы m в заголовке

OutputVar := "1.08 М/2.61 К — µTorrent 3.2.3"
MsgBox, % var1 := RegExReplace(OutputVar, "(.*)/.*", "$1")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: OmTatSat, 2016-02-10 02:25:14)

Re: AHK: Regex, поиск буквы m в заголовке

Меседж "1.08 М" как это использовать для описанной выше цели?
Мне нужно "м" это я знаю как применить...

6

Re: AHK: Regex, поиск буквы m в заголовке

Так а вы задачу-то сформулируйте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: OmTatSat, 2016-02-10 02:25:49)

Re: AHK: Regex, поиск буквы m в заголовке

Вкратце - если скорость больше 10кб то выполнить код.
Я понимаю так, можно проверять по первой цифре и по наличию буквы "м" в заголовке.

8

Re: AHK: Regex, поиск буквы m в заголовке

А что, у нас заглавные буквы и точки уже отменили? Я не знал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Regex, поиск буквы m в заголовке

Кстати, это был такой тонкий намёк, что неплохо бы исправиться.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Regex, поиск буквы m в заголовке

Так как-то:

OutputVar := "9 K/2.61 К — µTorrent 3.2.3"
var1 := RegExMatch(OutputVar, "(.*)\s+(.)/", match)
if (match2 != "M" && match1 < 10)
		MsgBox, Действие

Только если М кириллицей написано, нужно в коде заменить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Regex, поиск буквы m в заголовке

А я такое насочинял.

#NoTrayIcon
#SingleInstance, force
DetectHiddenWindows, on
sleep, 64000
winclose, ahk_class uTorrent Helper
sleep, 3000
Process, close, uTorrentHelper.exe
WinGetTitle, OutputVar, ahk_class µTorrent4823DF041B09
var := RegExReplace(OutputVar, ".*?(\d+).*", "$1")
var_letter_m := RegExReplace(OutputVar, "(.*)/.*", "$1")
M = М
IfInString, var_letter_m, %M%
	b := 1
   else
	b := 0

if ((var < 10) & (b = 0))
{
sleep 128000
WinGetTitle, OutputVar, ahk_class µTorrent4823DF041B09
var1 := RegExReplace(OutputVar, ".*?(\d+).*", "$1")
var_letter_m1 := RegExReplace(OutputVar, "(.*)/.*", "$1")
IfInString, var_letter_m, %M%
	b1 := 1
   else
	b1 := 0
if ((var1 < 10) & (b1 = 0))
{
tooltip, var1= 0
WinMenuSelectItem, ahk_class µTorrent4823DF041B09,, Файл, Выход
return
}
}
return

Надо попробовать ваш вариант, выглядит красивее.

12

Re: AHK: Regex, поиск буквы m в заголовке

teadrinker
Благодарю! Хороший код, работает как надо. Благодаря Вам итоговый код стал более правильным и занимает меньше строк.

; 
#NoTrayIcon
#SingleInstance, force
DetectHiddenWindows, on
sleep, 64000
winclose, ahk_class uTorrent Helper
sleep, 3000
Process, close, uTorrentHelper.exe
WinGetTitle, OutputVar, ahk_class µTorrent4823DF041B09
var := RegExMatch(OutputVar, "(.*)\s+(.)/", match)
if (match2 != "М" && match1 < 10)
{
sleep 128000
WinGetTitle, OutputVar, ahk_class µTorrent4823DF041B09
var1 := RegExMatch(OutputVar, "(.*)\s+(.)/", match)
if (match2 != "М" && match1 < 10)
{
WinMenuSelectItem, ahk_class µTorrent4823DF041B09,, Файл, Выход
return
}
}
return

13

Re: AHK: Regex, поиск буквы m в заголовке

teadrinker а где вообще можно почитать про RegExMatch, чтобы писать такой код как вы?
Вообще реально чтобы новичёк придумал такой код как вы написали?
Или только после годов практики программирования?

14

Re: AHK: Regex, поиск буквы m в заголовке

OmTatSat пишет:

а где вообще можно почитать про RegExMatch

Регулярные выражения (RegEx) - краткий справочник
RegExMatch()

15

Re: AHK: Regex, поиск буквы m в заголовке

Я специально именно с RegEx разбирался пару месяцев. Изучал по английскому хелпу и по документации, ссылки на которую там даны. Но не считаю свой уровень познаний по этой теме действительно глубоким.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Regex, поиск буквы m в заголовке

yalanne Благодарю, эти справки попадались, но по ним написать код который написал teadrinker не получилось

17

Re: AHK: Regex, поиск буквы m в заголовке

teadrinker могли бы вы пожалуйста пояснить этот код,

var1 := RegExMatch(OutputVar, "(.*)\s+(.)/", match)
if (match2 != "M" && match1 < 10)

чтобы в следующий раз самому такое написать?
Например, как получился match1 и 2, как ищется цифра и как буква и как задано её положение в тексте? Почему использовано && заместо просто &?

18 (изменено: yalanne, 2016-02-12 00:41:16)

Re: AHK: Regex, поиск буквы m в заголовке

Этот шаблон
(.*)\s+(.)/
можно вот так прочесть:

Группа любых символов с неизвестным количеством . Эти группы в круглых скобках передают значения в переменную. Так как это первые круглые скобки, они будут иметь индекс 1 в переменной.

Знак точки определяет что это может быть любой символ(один), но если стоит знак умножения или же плюса то их может быть неизвестное количество(+ и * делают похожую функцию. Если умножение заменить на плюс то будет делать то же самое в данном случае).

Дальше указываем что идут пробелы или табуляция(так же неизвестное количество).
Затем выводим во вторую переменную один символ
Далее указываем что после этого символа взятого в переменную должен быть знак /.


По поводу && и &. Это абсолютно разные операторы хоть и похоже. && - это оператор "и" в место его можно использовать "and". А вот & это побитовая операция, она не чего общего не имеет с оператором и. вот пример использования этого оператора:

var := 0x3
msgbox % var & 0x1

По поводу этого. Я знаю как это работает и как применить в более сложном примере, но не знаю как объяснить.

19

Re: AHK: Regex, поиск буквы m в заголовке

Если дальше соберётесь говорить о побитовых операциях, заводите отдельную тему.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Regex, поиск буквы m в заголовке

yalanne отлично, Благодарю!

По поводу одного &.
Почему в этом случае,

IF ((A_priorkey = "mbutton") & (OutputVarX > 108) & (elapsedtime > 220) & (elapsedtime < 520) & (OutputVarX = OutputVarX2) & (OutputVary = OutputVary2) & (A_Cursor = "Arrow"))
{
	ToolTip, %A_priorkey%
Send, +{mButton}

он работает как и?

21

Re: AHK: Regex, поиск буквы m в заголовке

yalanne отлично разъясняете!
Похоже я разобрался!

OutputVar := "12.456 h/ 5673 567-"
var1 := RegExMatch(OutputVar, "(.*)....\s+(.)/\s+(.+)-", match)
;if (match2 != "М" && match1 < 10)
		MsgBox, match2- %match2% match1 - %match1% match3 - %match3%

Работает, Урааа!)
Вам было бы хорошо писать уроки. Ещё интересно знак - после (.+) работает как вы описали, а вот точка после (.*) убирает один символ, заместо показывать то, что перед точкой. Точку нужно как-то по особому писать, или задать условие показывать то, что перед точкой не реально?

22 (изменено: yalanne, 2016-02-12 14:51:48)

Re: AHK: Regex, поиск буквы m в заголовке

Что бы использовать точку как часть шаблона, а не как оператор regex, то надо добавить перед точкой знак \ (это работает и с другими операторами: плюс,скобки и т.д.)
Так же что бы не писать много точек можно использовать тот же знак умножения.
Вот пример:

OutputVar := "12.456 h/ 5673 567-"
var1 := RegExMatch(OutputVar, "(.*)\..*\s+(.)/\s+(.+)-", match)
;if (match2 != "М" && match1 < 10)
MsgBox % match1 "`n" match2 "`n" match3

Получить в переменную любое количество символов пока не встретится точка, затем пропускаем символы пока не встретим пробелы или табуляцию. Далее заносим во вторую переменную один символ после которого идет знак "/" . Затем указываем что дальше идут пробелы а после них группа символов которые пойдут в 3ю переменную, после них должен быть знак минуса.


И насчет одной &.
Представь что грубо говоря этот символ как знак математического умножения

msgbox % 1 & 1 & 1 ;& 0

Если условие не срабатывает а это ноль в итоге все будет ноль.

23 (изменено: Flasher, 2016-02-12 13:50:37)

Re: AHK: Regex, поиск буквы m в заголовке

yalanne пишет:

(так как по умолчанию этот символ служит что бы заносить другие операторы как часть шаблона, то что бы занести сам этот символ указывается вот так /\).

Вы путаете. \ тут не к /\, а к \s. В строке он вообще отсутствует, а если бы присутствовал, то для указания в выражении экранировался бы дубликатом - \\.

Добавлено:
Выделение цветом должно быть таким: (.*)\..*\s+(.)/\s+(.+)-
А в оранжевом описании \ нужно поменять на /.

24

Re: AHK: Regex, поиск буквы m в заголовке

yalanne Отличные уроки! Добавлю эту тему себе в закладки на будущее.

Ещё один момент который думаю может пригодится по регеху.


OutputVar := "12,456 h/ 496673 567-"
var1 := RegExMatch(OutputVar, "(.*)\,.*\s+(.)/\s++(.+)-", match)
;if (match2 != "М" && match1 < 10)
MsgBox % match1 "`n" match2 "`n" match3

в match3 получается "496673 567" а как указать чтобы регех пропускал 2 пробела и в match3 заносился только "567"?

25

Re: AHK: Regex, поиск буквы m в заголовке

OmTatSat

var1 := RegExMatch(OutputVar, "^(\d+),\d+ (.)/ \d+ (\d+)", match)

26

Re: AHK: Regex, поиск буквы m в заголовке

Flasher \d+  в данном случае это любая цифра? И зачем нужен знак ^? Когда его убираю всё так же работает.

27

Re: AHK: Regex, поиск буквы m в заголовке

OmTatSat
Да. Цифра. Знак указывает на начало строки для урезания коллекции найденных совпадений.

28

Re: AHK: Regex, поиск буквы m в заголовке

Спасибо