1

Тема: AHK: RegExMatch и подшаблоны

Подскажите как создать массив хоккейных команд.
В d1 записывается Calgary Flames, а d2 должно быть Vancouver Canucks, но там почему-то пусто.


text := "Times New Roman;color:00F>Calgary Flames</td></tr><tdcolor:00F>Vancouver Canucks</td></tr><tr>"
pattern := "00F>(.+?)</td>"
m := RegExMatch(text, pattern, d)
MsgBox % d1 d2

2

Re: AHK: RegExMatch и подшаблоны

Zohann пишет:

а d2 должно быть Vancouver Canucks

Нет, не должно быть. В d2 мог бы быть второй подшаблон (а не второе вхождение первого), но в паттерне только один.
Для поиска второго вхождения подшаблона нужно воспользоваться параметром StartingPosition.

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

3 (изменено: creature.ws, 2013-02-08 17:55:59)

Re: AHK: RegExMatch и подшаблоны

text := "Times New Roman;color:00F>Calgary Flames</td></tr><tdcolor:00F>Vancouver Canucks</td></tr><tr>"
m := RegExFind(text, "F>\K[^<]+")
MsgBox % m[1] "`n" m[2]

RegExFind(ByRef string, ByRef pattern) {
    startPos := 1, EntryList := []

    while pos := RegExMatch(string, pattern, match, startPos)
        EntryList.Insert(match), startPos := pos + (IsObject(match)? match.len : StrLen(match))

    return EntryList
}

4

Re: AHK: RegExMatch и подшаблоны

teadrinker пишет:

Нет, не должно быть. В d2 мог бы быть второй подшаблон (а не второе вхождение первого), но в паттерне только один.

Вот оно как. А в справке написано: "Например, функция RegExMatch() в своем выходном массиве может сохранить соответствия всех выделенных подшаблонов".

creature.ws Спасибо, т.к. я еще не изучал AHK_L, немножко переделал.

RegExFind(string, pattern) 
    {
    startPos := 1, EntryList := []
    Loop {
        startPos := RegExMatch(string, pattern, match, startPos) + 1
        If startPos = 1
            Break
        EntryList.Insert(match)    
        }
    Return EntryList
    }

5

Re: AHK: RegExMatch и подшаблоны

Zohann пишет:

А в справке написано: "Например, функция RegExMatch() в своем выходном массиве может сохранить соответствия всех выделенных подшаблонов".

Здесь имеется в виду первое вхождение каждого подшаблона, начиная со StartingPosition.

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

6

Re: AHK: RegExMatch и подшаблоны

Буду знать, спасибо.

7 (изменено: creature.ws, 2013-02-09 01:01:57)

Re: AHK: RegExMatch и подшаблоны

немножко переделал.

Смещаться на один символ «правильнее», чем проверять, не указал ли пользователь опцию "O"?

m1 := RegExFind1("qweasdzxc", "\w\w")
m2 := RegExFind2("qweasdzxc", "\w\w")

loop 2 {
    o := ""
    for key, value in m%A_Index%
        o .= key ": " value "`n"
    MsgBox % o
}

RegExFind1(ByRef string, ByRef pattern) {
    startPos := 1, EntryList := []

    while pos := RegExMatch(string, pattern, match, startPos)
        EntryList.Insert(match), startPos := pos + (IsObject(match)? match.len : StrLen(match))

    return EntryList
}

RegExFind2(string, pattern)
    {
    startPos := 1, EntryList := []
    Loop {
        startPos := RegExMatch(string, pattern, match, startPos) + 1
        If startPos = 1
            Break
        EntryList.Insert(match)
        }
    Return EntryList
    }

Выхлоп RegExFind2 соответствует указанному выражению, но практично ли возвращать «все» возможные соответствия имеющиеся в строке?

8

Re: AHK: RegExMatch и подшаблоны

Для моего конкретного случая это не так принципиально, тем более смещение startPos идет не на 1 символ, а на порядковый номер найденного символа в строке. В Вашем примере из qweasdzxc RegExFind2 вернет qw, we, ea, as, согласен, не практично, но и строка то у меня не односложная как у Вас в примере.
А вот про метасимвол \K можно узнать поподробнее? В рунете маловато как то примеров.

9 (изменено: serzh82saratov, 2013-02-10 04:46:45)

Re: AHK: RegExMatch и подшаблоны

Zohann пишет:

А вот про метасимвол \K можно узнать поподробнее? В рунете маловато как то примеров.

Присоединяюсь.
Сделал как смог сам:

text := "Times New Roman;color:00F>Calgary Flames</td></tr><tdcolor:00F>Vancouver Canucks</td></tr><tr>"
Command := []
loop {
p++
p := RegExMatch(text, "(?<=00F>)(.*?)(?=</td>)", match, p)
if !p
break
Command.Insert(match)
}
MsgBox % Command[1] "`n" Command[2]

Хотелось бы понять на примере, чем паттерн

"F>\K[^<]+"

отличается от

"(?<=00F>)(.*?)(?=</td>)"

и что такое "\K"?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: serzh82saratov, 2013-02-10 06:37:41)

Re: AHK: RegExMatch и подшаблоны


text := "Times New Roman;color:00F>Calgary Flames</td></tr><tdcolor:00F>Vancouver Canucks</td></tr><tr>"
loop { 
p++
p := RegExMatch(text, "(?<=00F>)(.*?)(?=</td>)", match, p)
if !p
break
Command%A_Index% = %match%
} 
MsgBox %Command1%`n%Command2%

creature.ws
OFF:

+ открыть спойлер

Ещё нубский вопрос, является ли здесь %Command% - массивом? И, есть ли отличие от вашего примера выше  с EntryList := []
-----
Вроде дошло, если использовать внутри функкции то она не сможет вернуть массив по имени, а переменные Command%A_Index% нельзя\неудобно будет сделать глобальными.
Или есть ещё какие то тонкости, при работе с массивами?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: RegExMatch и подшаблоны

чем паттерн [...] отличается от [...]

Ничем, количеством символов, путём поиска соответствия. Выбирайте вариант по нраву.

The escape sequence \K is similar to a look-behind assertion because it causes any previously-matched characters to be omitted from the final matched string. For example, foo\Kbar matches "foobar" but reports that it has matched "bar".

Теперь эта фраза есть и в рунете

12

Re: AHK: RegExMatch и подшаблоны

Теперь эта фраза есть и в рунете

В рунете и на русском есть пара кратких описаний, но примеров нет. Понял только что исключает найденное (верно?) из дальнейшего поиска соответствий.

а переменные Command%A_Index% нельзя\неудобно будет сделать глобальными

А я сделал прямо в функции Loop присвоение к переменной, типа out .= match "=" team "`n" (match - это еще одно соответсвие из text), а потом return out и записываю out в ini-файл.

13

Re: AHK: RegExMatch и подшаблоны

Зачем примеры, если есть однозначное определение.

MsgBox % RegExReplace("1`n2`n3`n4`n`n5`n6`n7", "\n[^\n]+\K\n")

Результат как при использовании (?<=)

14

Re: AHK: RegExMatch и подшаблоны

Zohann пишет:

Подскажите как создать массив хоккейных команд.

Массив можно создавать только из футбольных команд.

15

Re: AHK: RegExMatch и подшаблоны

А я сделал прямо в функции Loop присвоение к переменной, типа out .= match "=" team "`n" (match - это еще одно соответсвие из text), а потом return out и записываю out в ini-файл.

На массив непохоже, скорее просто многострочная переменная, что задачка попроще.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: RegExMatch и подшаблоны

Возник вопрос:
имеется массив, какой самый простой способ перевести его в многострочную переменную.То есть после каждой ссылки, количество которых заранее неизвестно, добавлять в переменную через "`n".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: RegExMatch и подшаблоны

serzh82saratov пишет:

На массив непохоже

Я и не говорил про массив, надо было создать инишку, что и получилось благодаря уважаемому creature.ws, при чутком руководстве ypppu и мудрым советам teadrinker.

18 (изменено: serzh82saratov, 2013-02-11 20:49:40)

Re: AHK: RegExMatch и подшаблоны

Zohann пишет:

Подскажите как создать массив хоккейных команд.

Zohann пишет:

Я и не говорил про массив

Вот и я непонял 1 и 14 пост

Zohann пишет:

надо было создать инишку

Об этом конечно мне надо было-бы догадаться самому.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: RegExMatch и подшаблоны

Да в сообщении 12 написано про ini-файл, ваши придирки к словам уже не относятся к теме, как и сообщение 16.

20 (изменено: serzh82saratov, 2013-02-14 22:11:49)

Re: AHK: RegExMatch и подшаблоны

Подскажите что значит "while" в строке:

while pos := RegExMatch(string, pattern, match, startPos)

поста №3, из справки ничего не понятно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: RegExMatch и подшаблоны

Имеется ввиду, что пока то что возвращает RegExMatch (переменная pos) будет не ровна нулю, перебор в цикле будет происходить, жмём пробел для прогресса:

ListVars
WinSet, AlwaysOnTop, On, A
WinMove, A,, 888, 110, 892, 812
WinSet, Style, -0xC00000, A

text_:="Times New Roman;color:00F>Calgary Flames</td></tr>"
     . "<tdcolor:00F>Vancouver Canucks</td></tr><tr>"

m:=RegExFind(text_, "F>\K[^<]+")

WinHide, A
MsgBox, 262144, % A_Space, % m.1 "`n"m.2

ExitApp

RegExFind(ByRef string, ByRef pattern)
{
   startPos:=1, EntryList:=[]

   While, pos:=RegExMatch(string, pattern, match, startPos)
   {
      EntryList.Insert(match), startPos:=pos+(IsObject(match) ? match.len:StrLen(match))
      _index:=A_Index, _line:=A_LineNumber
      ListVars
      Input, _, I, {vk20}
   }

   For _k, _v In EntryList
     `(A_Index<=9 ? _k0%A_Index%:_k%A_Index%):=_k
   ,  (A_Index<=9 ? _v0%A_Index%:_v%A_Index%):=_v
   ,  _maxIndex:=A_Index
   _line:=A_LineNumber
   ListVars
   Input, _, I, {vk20}

   Return, EntryList
}

22 (изменено: serzh82saratov, 2013-02-15 00:31:37)

Re: AHK: RegExMatch и подшаблоны

Спасибо, очень наглядно! То есть "While" это цикл в котором сразу задаётся условие выхода?
И как (синтаксис) задать условие например: если А = 2 то выход.

While, (А = "2")
{
А++
MsgBox %A_Index%
}
MsgBox While!

или есть ограниченный перечень условий?


  • Вроде понял, при каждой итерации условие должно выполнятся, и когда "ложь", то выход.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: RegExMatch и подшаблоны

Для того, чтобы отслеживать состояние переменных в нутри цикла, лучше использовать связку Loop Until:

ListVars
WinSet, AlwaysOnTop, On, A
WinMove, A,, 888, 110, 892, 812
WinSet, Style, -0xC00000, A

Loop
{
   а++
   ListVars
   MsgBox, 262144, % A_LineNumber, % A_Index ;, 1
}
Until, а=2
ListVars
MsgBox, 262144, % A_LineNumber, % "End"
ExitApp

24 (изменено: serzh82saratov, 2013-02-15 00:37:47)

Re: AHK: RegExMatch и подшаблоны

С While вроде дошло. Теперь непонятно с "Loop"... Где тут условие выхода, если условие это строка:

Until, а=2

то оно же ниже расположено. И что такое Until?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25 (изменено: Malcev, 2013-02-15 00:56:11)

Re: AHK: RegExMatch и подшаблоны

http://l.autohotkey.net/docs/commands/Until.htm
Только непонятно, чем лучше.
Я бы вообще сделал бы так

ListVars
WinSet, AlwaysOnTop, On, A
WinMove, A,, 888, 110, 892, 812
WinSet, Style, -0xC00000, A
Loop
{
   a++
   ListVars
   MsgBox, 262144, % A_LineNumber, % A_Index ;, 1
   if a=2
      break
}
ListVars
MsgBox, 262144, % A_LineNumber, % "End"
ExitApp

А все эти новшества меня только запутывают, например как "if else" записывать одной строкой.

26

Re: AHK: RegExMatch и подшаблоны

someString:="white black yellow marine other"

Loop, Parse, someString, % A_Space
   MsgBox, 262144, % A_Index ", "A_LineNumber, % currentColor:=A_LoopField ;, 1
Until, A_LoopField="yellow"

MsgBox, 262144, % A_LineNumber, % "stop on: "currentColor
ExitApp
serzh82saratov пишет:

...что такое Until?

Проверка состояния переменных после каждой итерации, и соответственно прекращение цикла если состояние определённой переменной совпадает с выражением.