1

Тема: AHK: Позиция в While

Добрый день. Как правильно обозначить позицию "Pos", чтобы обрабатывались все соответствия, идущие подряд? По какой-то причине, содержимое <relative>(.*?)</relative> — обрабатывается через один раз.

#SingleInstance Force

fBody =
(
<user>
<relatives list="true">
<relative>
<id>-462658649</id>
<type>sibling</type>
<name>Наталья Маслова</name>
</relative>
<relative>
<id>-697067159</id>
<type>sibling</type>
<name>Оксана Антонова</name>
</relative>
<relative>
<id>-783504179</id>
<type>child</type>
<name>Данил</name>
</relative>
<relative>
<id>-841638376</id>
<type>child</type>
<name>Максим</name>
</relative>
</relatives>
</user>

)

   match := "", Pos := 1
   While Pos := RegExMatch(fBody, "s)<user>(.*?)</user>\R",match,Pos+StrLen(match))
   {

      matcdh := "", Pos := 1
      While Pos := RegExMatch(match1, "s)<relative>(.*?)</relative>",matcdh,Pos+StrLen(matcdh))
      {
         matcdh1 := RegExReplace(matcdh1, "(\R|</[^>]*>)", "")
         matcdh1 := RegExReplace(matcdh1, "<([^>]*)>", "|$1: ")
         StringReplace, match1, match1, %matcdh%, %matcdh1%, All
      }

      msgbox % match1
   }

2

Re: AHK: Позиция в While

Вроде всё правильно обрабатывается.

fBody =
(
<user>
<relatives list="true">
<relative>
<id>-462658649</id>
<type>sibling</type>
<name>Наталья Маслова</name>
</relative>
<relative>
<id>-697067159</id>
<type>sibling</type>
<name>Оксана Антонова</name>
</relative>
<relative>
<id>-783504179</id>
<type>child</type>
<name>Данил</name>
</relative>
<relative>
<id>-841638376</id>
<type>child</type>
<name>Максим</name>
</relative>
</relatives>
</user>

)

matcdh := "", Pos := 1
While Pos := RegExMatch(fBody, "s)<relative>(.*?)</relative>",matcdh,Pos+StrLen(matcdh))
   MsgBox, % matcdh
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: peterverhovensky, 2022-01-20 04:53:10)

Re: AHK: Позиция в While

А если в формате "While — с вложенным While"? У меня первый код следующий результат показывает:

<relatives list="true">
|id: -462658649|type: sibling|name: Наталья Маслова
<relative>
<id>-697067159</id>
<type>sibling</type>
<name>Оксана Антонова</name>
</relative>
|id: -783504179|type: child|name: Данил
<relative>
<id>-841638376</id>
<type>child</type>
<name>Максим</name>
</relative>
</relatives>

То есть, "<relative>.*?</relative>" через один — пропущены без обработки, тогда как все они должны иметь примерно следующий вид:

|id: -462658649|type: sibling|name: Наталья Маслова

Поэтому предполагаю, что при захвате первой пары тегов — берется позиция неправильно, из-за чего следующая похожая пара тегов пропускается.

4

Re: AHK: Позиция в While

Так вы же во вложенном цикле изменяете переменную match1, по которой идёт поиск (укорачиваете). Советую использовать более внятные названия для переменных, иначе даже сами не сможете разобраться, где и что меняется.

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