301

Re: AHK: Регулярные выражения

Попробовал и так

RegExMatch(My_text, "<data>(s).+?)</data>", match)
Result := match1

и эдак

RegExMatch(My_text, "<data>s)(.+?)</data>", match)
Result := match1

К сожалению не помогло.

302

Re: AHK: Регулярные выражения

RegExMatch(My_text, "s)<data>(.+?)</data>", match)
Result := match1

А так?

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

303

Re: AHK: Регулярные выражения

Нет, не находит. Наверное какое-то ограничение на длину Haystack.

304

Re: AHK: Регулярные выражения

Не знаю ограничения, кроме 64 MB, указанного в #MaxMem.

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

305

Re: AHK: Регулярные выражения

"Тоже сейчас мучаюсь с регулярками. проверяю в Sublime - всё работает. Запускаю AHK - не найдено. Почти целый день убил на это. У меня регулярки не маленькие - спокойно могут перевалить за килобайт и более. Может в этом какое ограничение есть?

+ У меня многострочность. Перепробовал много приставок в начале - не помогают. Обычно должно хватать "m)".
Ещё немного помучаюсь - буду искать обходные пути.

Мои разработки: Bsod finder, MyTetra Integrator

306 (изменено: Molotok, 2018-05-25 01:50:56)

Re: AHK: Регулярные выражения

  • Может кто посмотрит? - я тут положил ahk и текстовый файл с данными. Всё готово к запуску и тесту.
    В текстовом файле регулярка должна найти весь текст, кроме своей копии расположенной внизу.

  • Недавно перебирал програмки для работы с регулярками - и обратил внимание на одну интересную функцию в "Expresso" - возможность создать DLL с уже настроенными функциями регулярок. Делаются эти DLL очень просто и быстро. Как запасной аэродром могут иногда сгодится.

Мои разработки: Bsod finder, MyTetra Integrator

307

Re: AHK: Регулярные выражения

Проверяйте ErrorLevel.

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

308 (изменено: Molotok, 2018-05-25 02:04:09)

Re: AHK: Регулярные выражения

Код 0. Отсутствие ошибок. Значит дело в синтаксисе и ключах. Но тут тёмный лес.
Попробую собрать всё в одну строку и с ней уже работать.

Мои разработки: Bsod finder, MyTetra Integrator

309

Re: AHK: Регулярные выражения

Взял и удалил часть файла - всё заработало. Главное чтобы он не превышал 10 МБайт. Только не припомню где это ограничение могло быть в документации? Файл читал через метод объекта File.Open.

310 (изменено: stealzy, 2018-05-25 09:34:04)

Re: AHK: Регулярные выражения

The default value for the limit can be set when PCRE is built; the default default is 10 million

В ahk нет директив изменения PCRE_EXTRA_MATCH_LIMIT, поэтому варианты такие:
• Просить директивы на офф-форуме в Wish List. Также просить сделать передачу подобных PCRE_ERROR_MATCHLIMIT ошибок в ErrorLevel.
• Собрать свою версию ahk из исходников, где установить свои лимиты для библиотеки PCRE
• Как ни парадоксально, подключать PCRE как внешнюю dll

311 (изменено: DD, 2018-07-05 14:06:10)

Re: AHK: Регулярные выражения

Каким выражением можно надежно получить содержимое "article":"(.*?)", при этом пропуская экранированные кавычки?

str =
(
{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321869939","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321869939#t1321869939","article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},
)
msgbox % RegExReplace(str, "s)""article"":""(.+?[^\\])""", "$1")

312 (изменено: DD, 2018-07-05 14:27:28)

Re: AHK: Регулярные выражения

Так вроде надо: ""(.*?[^\\])"".

313 (изменено: Molotok, 2018-07-05 15:00:46)

Re: AHK: Регулярные выражения

У меня так вышло:

(?<=\x22article\x22:\x22).*\x5c\x22>(?=\x22)

Находит: <img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">
Это в том случае, если часть выделенная синим цветом должна предшествовать искомой подстроке.

Если же она должна включаться тогда:

\x22article\x22:\x22.*\x5c\x22>(?=\x22)

Находит: "article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">

Мои разработки: Bsod finder, MyTetra Integrator
+ DD

314

Re: AHK: Регулярные выражения

Или так:

str =
(
{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321869939","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321869939#t1321869939","article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},
)
msgbox % RegExReplace(str, ".*""article"":""(.+?)(?<!\\)"".*", "$1")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder
+ DD

315 (изменено: teadrinker, 2018-07-05 17:14:48)

Re: AHK: Регулярные выражения

А если строка — полноценный JSON, можно ещё так:

str =
(
{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321869939","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321869939#t1321869939","article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"}]}
)

obj := JSON.Parse(str)

MsgBox, % SearchKey(obj, "article")

SearchKey(obj, key)  {
   for k, v in obj  {
      if (k = key)
         Return v
      
      if IsObject(v)  {
         res := SearchKey(v, key)
         if (res != "")
            Return res
      }
   }
}

class JSON
{
   static JS := JSON._GetJScripObject()
   
   Parse(JsonString)  {
      try oJSON := this.JS.("(" JsonString ")")
      catch  {
         MsgBox, Wrong JsonString!
         Return
      }
      Return this._CreateObject(oJSON)
   }

   _GetJScripObject()  {
      VarSetCapacity(tmpFile, ((MAX_PATH := 260) - 14) << !!A_IsUnicode, 0)
      DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
      
      FileAppend,
      (
      <component>
      <public><method name='eval'/></public>
      <script language='JScript'></script>
      </component>
      ), % tmpFile
      
      JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
      FileDelete, % tmpFile
      JSON._AddMethods(JS)
      Return JS
   }

   _AddMethods(ByRef JS)  {
      JScript =
      (
         Object.prototype.GetKeys = function () {
            var keys = []
            for (var k in this)
               if (this.hasOwnProperty(k))
                  keys.push(k)
            return keys
         }
         Object.prototype.IsArray = function () {
            var toStandardString = {}.toString
            return toStandardString.call(this) == '[object Array]'
         }
      )
      JS.("delete ActiveXObject; delete GetObject;")
      JS.(JScript)
   }

   _CreateObject(ObjJS)  {
      res := ObjJS.IsArray()
      if (res = "")
         Return ObjJS
      
      else if (res = -1)  {
         obj := []
         Loop % ObjJS.length
            obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
      }
      else if (res = 0)  {
         obj := {}
         keys := ObjJS.GetKeys()
         Loop % keys.length
            k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
      }
      Return obj
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

316

Re: AHK: Регулярные выражения

У этого варианта минус, то что постоянно создается и удаляется файл.
Через ActiveScript разве нельзя его запустить?

317

Re: AHK: Регулярные выражения

Можно не удалять просто. Можно и через ActiveScript, но так как-то проще.

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

318

Re: AHK: Регулярные выражения

/*<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
*/ JS := ComObjGet("script:" . A_ScriptFullPath)
q:="3+4*(6-2)" 
MsgBox % JS.eval(q)

319

Re: AHK: Регулярные выражения

  Забавно, но сработает, если только скрипт запускается из файла, а не динамически из текста.

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

320

Re: AHK: Регулярные выражения

Вот так уже не работает:

/*
<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
*/

str =
(
{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321869939","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321869939#t1321869939","article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"}]}
)

MsgBox, % IsObject( ComObjGet("script:" . A_ScriptFullPath) )
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

321 (изменено: DD, 2018-07-05 19:13:29)

Re: AHK: Регулярные выражения

Как интересно вы тут пишите)). Как раз ломал голову над извлечением из JSON "непостоянных" элементов.
То есть, в строке — отдельные блоки комментариев, внутри которых, в каком-то из них может присутствовать, к примеру, "userpic":"(.*?)", а в другом комментарии этого элемента может не быть. Пытался извлекать по такому принципу, —

match := "", Pos := 1
While Pos := RegExMatch(a, "s)""shown"":[^\R]*(""userpic"":""[^""]*"")?[^\R]*(""uname"":"".*?[^\\]"")?[^\R]*(""commenter_journal_base"":""[^""]*"")?[^\R]*(""dtalkid"":\d+)?[^\R]*(""upictitle"":"".*?[^\\]"")?[^\R]*(""article"":"".*?[^\\]"")?[^\R]*(""ctime"":""[^""]*"")?[^\R]*(""userhead_url"":""[^""]*"")?[^\R]*(""dname"":""[^\R]*[^\\]"")?[^\R]*",match,Pos+StrLen(match))
{
   y_cmts .= match1 "`n" match2 "`n" match3 "`n" match4 "`n" match5 "`n" match6 "`n" match7 "`n" match8 "`n" match9 "`n"
   MsgBox % y_cmts
}

но так и не понял, как в этой конструкции игнорировать возможные элементы.

Можно ли при такой задаче извлекать из JSON следующие значения элементов для каждого комментария, независимо от их наличия в строке — для вставки в шаблон с тегами?


"userpic"
"uname"
"commenter_journal_base"
"dtalkid":
"upictitle"
"article"
"ctime"
"userhead_url"
"dname"

322

Re: AHK: Регулярные выражения

teadrinker пишет:

Вот так уже не работает:

Да, если в коде присутствует знак "<" не срабатывает.

;<component><public><method name='eval'/></public><script language='JScript'></script></component>
JS := ComObjGet("script:" . A_ScriptFullPath)
if (a= "<")
   msgbox

323

Re: AHK: Регулярные выражения

DD пишет:

Можно ли при такой задаче извлекать из JSON следующие значения элементов для каждого комментария, независимо от их наличия в строке — для вставки в шаблон с тегами?

Я не совсем понял задачу. Мой последний код вроде работает же? Если есть ключ — показывает значение, если нет — пустое.

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

324 (изменено: DD, 2018-07-05 19:12:37)

Re: AHK: Регулярные выражения

В смысле, как осуществить перебор выбранных значений для каждого отдельного комментария? Ниже я увеличил количество ключей, но затрудняюсь сделать переход от объекта к объекту (от одного отдельно блока с комментарием — к другому):

str =
(
{"replycount":173,"comments":[{"collapsed":0,"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/125166311/76306440","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321676147","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"expand","title":"Развернуть"}],"uname":"leyb_bronshteyn","loaded":1,"p_tracked":0,"commenter_journal_base":"https://leyb-bronshteyn.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321676147,"talkid":5162797,"thread_url":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","above":1321663091,"upictitle":"leyb_bronshteyn: trotsky","article":"КОММЕНТАРИЙ1","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321676147&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 17:12:32 UTC","parent":1321663091,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://leyb-bronshteyn.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"leyb_bronshteyn","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"leyb_bronshteyn","user_alias":"","profile_url":"https://leyb-bronshteyn.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"leyb_bronshteyn","ctime_ts":1530378752,"is_best":0,"tracked":0},{"shown":0,"collapsed":1,"uname":"","loaded":0,"p_tracked":0,"commenter_journal_base":"","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321677683,"talkid":5162803,"thread_url":"https://livejournal.com/2796915.html?thread=1321677683#t1321677683","above":1321676147,"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321699955,"parent":1321676147,"massactions":1,"deleted":1,"is_promo":0,"dname":"","ctime_ts":1530378800,"leafclass":"deleted","is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/121339544/65211451","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321846131","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"expand","title":"Развернуть"}],"uname":"ext_2042553","loaded":1,"p_tracked":0,"commenter_journal_base":"http://my.mail.ru/list/iwasko/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321846131,"talkid":5163461,"thread_url":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","above":1321806195,"upictitle":"Иван Пирогов: pic#121339544","article":"КОММЕНТАРИЙ2","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321846131&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"3 дня назад","ctime":"1 июля 2018, 16:26:49 UTC","parent":1321806195,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"http://my.mail.ru/list/iwasko/","striked":null,"journaltype":"I","userhead_url":"https://l-stat.livejournal.net/img/mailru-profile.gif?v=12149?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"Иван Пирогов","inline_css":0,"attrs":null,"is_identity":1,"bold":1,"show_userhead":1,"username":"ext_2042553","user_alias":"","profile_url":"https://www.livejournal.com/profile?userid=65211451&t=I","alias":0}],"is_promo":0,"dname":"Иван Пирогов","ctime_ts":1530462409,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321712499","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321712499,"talkid":5162939,"thread_url":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","above":1321677683,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ3","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321712499&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:08:18 UTC","parent":1321677683,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530385698,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321713779","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321713779,"talkid":5162944,"thread_url":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","above":1321712499,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ4","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321713779&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321768563,"ctime":"30 июня 2018, 19:15:49 UTC","parent":1321712499,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530386149,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720435","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720435,"talkid":5162970,"thread_url":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","above":1321713779,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ5","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720435&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:29:16 UTC","parent":1321713779,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530390556,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720691","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720691,"talkid":5162971,"thread_url":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","above":1321720435,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ6","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720691&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:35:06 UTC","parent":1321720435,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530390906,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/82196355/5817510","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321717619","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"expand","title":"Развернуть"}],"uname":"poulsam","loaded":1,"p_tracked":0,"commenter_journal_base":"https://poulsam.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321717619,"talkid":5162959,"thread_url":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","above":1321695859,"upictitle":"Poul: pic#82196355","article":"КОММЕНТАРИЙ7","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321717619&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:47:49 UTC","parent":1321650291,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://poulsam.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"poulsam","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"poulsam","user_alias":"","profile_url":"https://poulsam.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"poulsam","ctime_ts":1530388069,"is_best":0,"tracked":0}]}

)


obj := JSON.Parse(str)

userpic := SearchKey(obj, "userpic")
uname := SearchKey(obj, "uname")
commenter_journal_base := SearchKey(obj, "commenter_journal_base")
dtalkid := SearchKey(obj, "dtalkid")
upictitle := SearchKey(obj, "upictitle")
article := SearchKey(obj, "article")
ctime := SearchKey(obj, "ctime")
userhead_url := SearchKey(obj, "userhead_url")
dname := SearchKey(obj, "dname")

msgbox %userpic%`n%uname%`n%commenter_journal_base%`n%dtalkid%`n%upictitle%`n%article%`n%ctime%`n%userhead_url%`n%dname%


SearchKey(obj, key)  {
   for k, v in obj  {
      if (k = key)
         Return v
      
      if IsObject(v)  {
         res := SearchKey(v, key)
         if (res != "")
            Return res
      }
   }
}

class JSON
{
   static JS := JSON._GetJScripObject()
   
   Parse(JsonString)  {
      try oJSON := this.JS.("(" JsonString ")")
      catch  {
         MsgBox, Wrong JsonString!
         Return
      }
      Return this._CreateObject(oJSON)
   }

   _GetJScripObject()  {
      VarSetCapacity(tmpFile, (MAX_PATH := 260) << !!A_IsUnicode, 0)
      DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
      
      FileAppend,
      (
      <component>
      <public><method name='eval'/></public>
      <script language='JScript'></script>
      </component>
      ), % tmpFile
      
      JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
      FileDelete, % tmpFile
      JSON._AddMethods(JS)
      Return JS
   }

   _AddMethods(ByRef JS)  {
      JScript =
      (
         Object.prototype.GetKeys = function () {
            var keys = []
            for (var k in this)
               if (this.hasOwnProperty(k))
                  keys.push(k)
            return keys
         }
         Object.prototype.IsArray = function () {
            var toStandardString = {}.toString
            return toStandardString.call(this) == '[object Array]'
         }
      )
      JS.("delete ActiveXObject; delete GetObject;")
      JS.(JScript)
   }

   _CreateObject(ObjJS)  {
      res := ObjJS.IsArray()
      if (res = "")
         Return ObjJS
      
      else if (res = -1)  {
         obj := []
         Loop % ObjJS.length
            obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
      }
      else if (res = 0)  {
         obj := {}
         keys := ObjJS.GetKeys()
         Loop % keys.length
            k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
      }
      Return obj
   }
}

325

Re: AHK: Регулярные выражения

str =
(
{"replycount":173,"comments":[{"collapsed":0,"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/125166311/76306440","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321676147","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"expand","title":"Развернуть"}],"uname":"leyb_bronshteyn","loaded":1,"p_tracked":0,"commenter_journal_base":"https://leyb-bronshteyn.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321676147,"talkid":5162797,"thread_url":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","above":1321663091,"upictitle":"leyb_bronshteyn: trotsky","article":"КОММЕНТАРИЙ1","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321676147&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 17:12:32 UTC","parent":1321663091,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://leyb-bronshteyn.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"leyb_bronshteyn","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"leyb_bronshteyn","user_alias":"","profile_url":"https://leyb-bronshteyn.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"leyb_bronshteyn","ctime_ts":1530378752,"is_best":0,"tracked":0},{"shown":0,"collapsed":1,"uname":"","loaded":0,"p_tracked":0,"commenter_journal_base":"","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321677683,"talkid":5162803,"thread_url":"https://livejournal.com/2796915.html?thread=1321677683#t1321677683","above":1321676147,"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321699955,"parent":1321676147,"massactions":1,"deleted":1,"is_promo":0,"dname":"","ctime_ts":1530378800,"leafclass":"deleted","is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/121339544/65211451","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321846131","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"expand","title":"Развернуть"}],"uname":"ext_2042553","loaded":1,"p_tracked":0,"commenter_journal_base":"http://my.mail.ru/list/iwasko/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321846131,"talkid":5163461,"thread_url":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","above":1321806195,"upictitle":"Иван Пирогов: pic#121339544","article":"КОММЕНТАРИЙ2","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321846131&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"3 дня назад","ctime":"1 июля 2018, 16:26:49 UTC","parent":1321806195,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"http://my.mail.ru/list/iwasko/","striked":null,"journaltype":"I","userhead_url":"https://l-stat.livejournal.net/img/mailru-profile.gif?v=12149?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"Иван Пирогов","inline_css":0,"attrs":null,"is_identity":1,"bold":1,"show_userhead":1,"username":"ext_2042553","user_alias":"","profile_url":"https://www.livejournal.com/profile?userid=65211451&t=I","alias":0}],"is_promo":0,"dname":"Иван Пирогов","ctime_ts":1530462409,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321712499","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321712499,"talkid":5162939,"thread_url":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","above":1321677683,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ3","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321712499&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:08:18 UTC","parent":1321677683,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530385698,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321713779","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321713779,"talkid":5162944,"thread_url":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","above":1321712499,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ4","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321713779&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321768563,"ctime":"30 июня 2018, 19:15:49 UTC","parent":1321712499,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530386149,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720435","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720435,"talkid":5162970,"thread_url":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","above":1321713779,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ5","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720435&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:29:16 UTC","parent":1321713779,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530390556,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720691","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720691,"talkid":5162971,"thread_url":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","above":1321720435,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ6","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720691&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:35:06 UTC","parent":1321720435,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530390906,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/82196355/5817510","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321717619","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"expand","title":"Развернуть"}],"uname":"poulsam","loaded":1,"p_tracked":0,"commenter_journal_base":"https://poulsam.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321717619,"talkid":5162959,"thread_url":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","above":1321695859,"upictitle":"Poul: pic#82196355","article":"КОММЕНТАРИЙ7","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321717619&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:47:49 UTC","parent":1321650291,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://poulsam.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"poulsam","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"poulsam","user_alias":"","profile_url":"https://poulsam.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"poulsam","ctime_ts":1530388069,"is_best":0,"tracked":0}]}

)


obj := JSON.Parse(str)
keys =
(
userpic
uname
commenter_journal_base
dtalkid
upictitle
article
ctime
userhead_url
dname
)

Loop, parse, keys, `n, `r
   MsgBox, % SearchKey(obj, A_LoopField)

SearchKey(obj, key)  {
   for k, v in obj  {
      if (k = key)
         Return v
      
      if IsObject(v)  {
         res := SearchKey(v, key)
         if (res != "")
            Return res
      }
   }
}

class JSON
{
   static JS := JSON._GetJScripObject()
   
   Parse(JsonString)  {
      try oJSON := this.JS.("(" JsonString ")")
      catch  {
         MsgBox, Wrong JsonString!
         Return
      }
      Return this._CreateObject(oJSON)
   }

   _GetJScripObject()  {
      VarSetCapacity(tmpFile, (MAX_PATH := 260) << !!A_IsUnicode, 0)
      DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
      
      FileAppend,
      (
      <component>
      <public><method name='eval'/></public>
      <script language='JScript'></script>
      </component>
      ), % tmpFile
      
      JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
      FileDelete, % tmpFile
      JSON._AddMethods(JS)
      Return JS
   }

   _AddMethods(ByRef JS)  {
      JScript =
      (
         Object.prototype.GetKeys = function () {
            var keys = []
            for (var k in this)
               if (this.hasOwnProperty(k))
                  keys.push(k)
            return keys
         }
         Object.prototype.IsArray = function () {
            var toStandardString = {}.toString
            return toStandardString.call(this) == '[object Array]'
         }
      )
      JS.("delete ActiveXObject; delete GetObject;")
      JS.(JScript)
   }

   _CreateObject(ObjJS)  {
      res := ObjJS.IsArray()
      if (res = "")
         Return ObjJS
      
      else if (res = -1)  {
         obj := []
         Loop % ObjJS.length
            obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
      }
      else if (res = 0)  {
         obj := {}
         keys := ObjJS.GetKeys()
         Loop % keys.length
            k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
      }
      Return obj
   }
}

Так?

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

326 (изменено: DD, 2018-07-05 20:52:27)

Re: AHK: Регулярные выражения

teadrinker, имелся в виду перебор группой. То есть, требуется разом перебирать ту группу ключей, что я выше в примере собрал в msgbox`е, чтобы эти ключи последовательно искались и выводились группой в пределах комментария. В строке, вместе с удалённым — 8 блоков комментариев (граница каждого начинается с ключа "shown":) и надо выводить те из перечисленных ключей, которые присутствуют в каждом из этих блоков.

Иначе говоря, переход к первому блоку комментария — выводятся имеющиеся в блоке значения ключей (независимо от того, представлены они там все, или нет):

userpic
uname
commenter_journal_base
dtalkid
upictitle
article
ctime
userhead_url
dname

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

327 (изменено: DD, 2018-07-05 20:54:14)

Re: AHK: Регулярные выражения

Мне нужен такой формат вывода, чтобы потом разом подставить эти значения ключей — в шаблон комментария с тегами, тогда как при выводе значений ключей по одному это не получится. Типа этого:

y_cmts .= "`n<div class=""comment"">`n<img class=""img"" src=""" match3 """>`n<div class=""info""><a href=""" match4 """>" match2 "</a> – " match7 "<span class=""vote"">" match6 "</span></div>`n<div class=""content"">" match5 "</div>`n</div>`n`n"

328 (изменено: teadrinker, 2018-07-05 21:03:27)

Re: AHK: Регулярные выражения

DD пишет:

Типа этого

Вообще не понимаю, о чём речь. Если нужно перебрать все "блоки", то так:

str =
(
{"replycount":173,"comments":[{"collapsed":0,"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/125166311/76306440","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321676147","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"expand","title":"Развернуть"}],"uname":"leyb_bronshteyn","loaded":1,"p_tracked":0,"commenter_journal_base":"https://leyb-bronshteyn.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321676147,"talkid":5162797,"thread_url":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","above":1321663091,"upictitle":"leyb_bronshteyn: trotsky","article":"КОММЕНТАРИЙ1","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321676147&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 17:12:32 UTC","parent":1321663091,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://leyb-bronshteyn.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"leyb_bronshteyn","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"leyb_bronshteyn","user_alias":"","profile_url":"https://leyb-bronshteyn.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"leyb_bronshteyn","ctime_ts":1530378752,"is_best":0,"tracked":0},{"shown":0,"collapsed":1,"uname":"","loaded":0,"p_tracked":0,"commenter_journal_base":"","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321677683,"talkid":5162803,"thread_url":"https://livejournal.com/2796915.html?thread=1321677683#t1321677683","above":1321676147,"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321699955,"parent":1321676147,"massactions":1,"deleted":1,"is_promo":0,"dname":"","ctime_ts":1530378800,"leafclass":"deleted","is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/121339544/65211451","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321846131","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"expand","title":"Развернуть"}],"uname":"ext_2042553","loaded":1,"p_tracked":0,"commenter_journal_base":"http://my.mail.ru/list/iwasko/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321846131,"talkid":5163461,"thread_url":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","above":1321806195,"upictitle":"Иван Пирогов: pic#121339544","article":"КОММЕНТАРИЙ2","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321846131&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"3 дня назад","ctime":"1 июля 2018, 16:26:49 UTC","parent":1321806195,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"http://my.mail.ru/list/iwasko/","striked":null,"journaltype":"I","userhead_url":"https://l-stat.livejournal.net/img/mailru-profile.gif?v=12149?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"Иван Пирогов","inline_css":0,"attrs":null,"is_identity":1,"bold":1,"show_userhead":1,"username":"ext_2042553","user_alias":"","profile_url":"https://www.livejournal.com/profile?userid=65211451&t=I","alias":0}],"is_promo":0,"dname":"Иван Пирогов","ctime_ts":1530462409,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321712499","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321712499,"talkid":5162939,"thread_url":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","above":1321677683,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ3","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321712499&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:08:18 UTC","parent":1321677683,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530385698,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321713779","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321713779,"talkid":5162944,"thread_url":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","above":1321712499,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ4","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321713779&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321768563,"ctime":"30 июня 2018, 19:15:49 UTC","parent":1321712499,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530386149,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720435","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720435,"talkid":5162970,"thread_url":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","above":1321713779,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ5","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720435&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:29:16 UTC","parent":1321713779,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530390556,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720691","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720691,"talkid":5162971,"thread_url":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","above":1321720435,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ6","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720691&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:35:06 UTC","parent":1321720435,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530390906,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/82196355/5817510","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321717619","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"expand","title":"Развернуть"}],"uname":"poulsam","loaded":1,"p_tracked":0,"commenter_journal_base":"https://poulsam.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321717619,"talkid":5162959,"thread_url":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","above":1321695859,"upictitle":"Poul: pic#82196355","article":"КОММЕНТАРИЙ7","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321717619&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:47:49 UTC","parent":1321650291,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://poulsam.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"poulsam","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"poulsam","user_alias":"","profile_url":"https://poulsam.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"poulsam","ctime_ts":1530388069,"is_best":0,"tracked":0}]}
)

obj := JSON.Parse(str)
keys =
(
userpic
uname
commenter_journal_base
dtalkid
upictitle
article
ctime
userhead_url
dname
)

for k, v in obj.comments  {
   Loop, parse, keys, `n, `r
      %A_LoopField%%k% := SearchKey(v, A_LoopField)
}

MsgBox, % userpic1 . "`n" . userpic2 . "`n" . userpic3
MsgBox, % uname1 . "`n" . uname2 . "`n" . uname3

SearchKey(obj, key)  {
   for k, v in obj  {
      if (k = key)
         Return v
      
      if IsObject(v)  {
         res := SearchKey(v, key)
         if (res != "")
            Return res
      }
   }
}

class JSON
{
   static JS := JSON._GetJScripObject()
   
   Parse(JsonString)  {
      try oJSON := this.JS.("(" JsonString ")")
      catch  {
         MsgBox, Wrong JsonString!
         Return
      }
      Return this._CreateObject(oJSON)
   }

   _GetJScripObject()  {
      VarSetCapacity(tmpFile, (MAX_PATH := 260) << !!A_IsUnicode, 0)
      DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
      
      FileAppend,
      (
      <component>
      <public><method name='eval'/></public>
      <script language='JScript'></script>
      </component>
      ), % tmpFile
      
      JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
      FileDelete, % tmpFile
      JSON._AddMethods(JS)
      Return JS
   }

   _AddMethods(ByRef JS)  {
      JScript =
      (
         Object.prototype.GetKeys = function () {
            var keys = []
            for (var k in this)
               if (this.hasOwnProperty(k))
                  keys.push(k)
            return keys
         }
         Object.prototype.IsArray = function () {
            var toStandardString = {}.toString
            return toStandardString.call(this) == '[object Array]'
         }
      )
      JS.("delete ActiveXObject; delete GetObject;")
      JS.(JScript)
   }

   _CreateObject(ObjJS)  {
      res := ObjJS.IsArray()
      if (res = "")
         Return ObjJS
      
      else if (res = -1)  {
         obj := []
         Loop % ObjJS.length
            obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
      }
      else if (res = 0)  {
         obj := {}
         keys := ObjJS.GetKeys()
         Loop % keys.length
            k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
      }
      Return obj
   }
}

Значение userpic в первом блоке будет сохранено в переменную userpic1, во втором — userpic2 и т. д. Дальше сами думайте.

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

329 (изменено: DD, 2018-07-05 21:48:27)

Re: AHK: Регулярные выражения

Почти то, что надо, спасибо! Оказалось, что всё уже настроено на работу в пределах блоков. Но остались вопросы: почему надо добавлять эти порядковые номера после переменных и почему автоматически не происходит перебор всех последующих блоков? Для этого можно вроде использовать loop, подставляя к переменной порядковый номер цикла, —


loop
   MsgBox, % userpic%a_index% "`n" uname%a_index% "`n" commenter_journal_base%a_index% "`n" dtalkid%a_index% "`n" upictitle%a_index% "`n" article%a_index% "`n" ctime%a_index% "`n" userhead_url%a_index% "`n" dname%a_index% "`n"

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


mrg .= "<b>" userpic "</b>`n" ;...

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

330

Re: AHK: Регулярные выражения

DD пишет:

почему надо добавлять эти порядковые номера после переменных и почему автоматически не происходит перебор всех последующих блоков?

Перебор блоков и создание переменных происходят в этом цикле:

for k, v in obj.comments  {
   Loop, parse, keys, `n, `r
      %A_LoopField%%k% := SearchKey(v, A_LoopField)
}

Количество блоков равно obj.comments.MaxIndex().

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

331

Re: AHK: Регулярные выражения

teadrinker, пользуюсь вашим json-парсером. Есть недостаток:
Строка(представляет из себя json-массив) конвертируется в объект без проблем, а вот обратно идет округление до N-нулей после запятой.
Как можно отключить округление?

Наглядный пример:


obj:=JSON.Parse("[2.460]")
MsgBox, % JSON.Stringify(obj[1])

332 (изменено: teadrinker, 2018-07-11 17:54:43)

Re: AHK: Регулярные выражения

Парсер тут ни при чём, просто при любых действиях с числами с запятой они в AHK по умолчанию округляются до шестого знака после запятой:

var := 0.1
MsgBox, % var + 0

Это можно изменить с помощью команды Format.
Если представить число, как строку, тогда увеличения количества цифр после запятой не произойдёт:

obj:=JSON.Parse("[""2.460""]")
MsgBox, % JSON.Stringify(obj[1])

class JSON
{
   static JS := JSON._GetJScripObject()
   
   Parse(JsonString)  {
      try oJSON := this.JS.("(" JsonString ")")
      catch  {
         MsgBox, Wrong JsonString!
         Return
      }
      Return this._CreateObject(oJSON)
   }
   
   Stringify(obj)  {
      if IsObject( obj )  {
         isArray := true
         for key in obj
            if !( key = A_Index || isArray := false )
               break
            
         for k, v in obj
            str .= ( A_Index = 1 ? "" : "," ) . ( isArray ? "" : this.Stringify(k) . ":" ) . this.Stringify(v)

         return isArray ? "[" str "]" : "{" str "}"
      }
      else if (obj*1)
         return obj
      
      for k, v in [["\", "\\"], [A_Tab, "\t"], ["""", "\"""], ["/", "\/"], ["`n", "\n"], ["`r", "\r"], [Chr(12), "\f"], [Chr(08), "\b"]]
         obj := StrReplace( obj, v[1], v[2] )
      
      while RegexMatch( obj, "[^\x20-\x7e]", key )  {
         str := Asc( key )
         val := "\u" . Chr( ( ( str >> 12 ) & 15 ) + ( ( ( str >> 12 ) & 15 ) < 10 ? 48 : 55 ) )
               . Chr( ( ( str >> 8 ) & 15 ) + ( ( ( str >> 8 ) & 15 ) < 10 ? 48 : 55 ) )
               . Chr( ( ( str >> 4 ) & 15 ) + ( ( ( str >> 4 ) & 15 ) < 10 ? 48 : 55 ) )
               . Chr( ( str & 15 ) + ( ( str & 15 ) < 10 ? 48 : 55 ) )
         obj := StrReplace(obj, key, val)
      }
      Return """" obj """"
   }
   
   GetFromUrl(url, body := "", contentType := "", userAgent := "")  {
      ; в случае удачи будет возвращена строка, в случае ошибки — массив с одним элементом-строкой с описанием ошибки
      try  {
         XmlHttp := ComObjCreate("Microsoft.XmlHttp")
         XmlHttp.Open("GET", url, false)
         ( contentType && XmlHttp.SetRequestHeader("Content-Type", contentType) )
         ( userAgent && XmlHttp.SetRequestHeader("User-Agent", userAgent) )
         XmlHttp.Send(body)
      }
      catch e
         Return ["Error!`n" . e.Message]
      status := XmlHttp.Status
      Return status = 200 ? XmlHttp.ResponseText : ["Error! Status: " . status . ", ResponseText: " . XmlHttp.ResponseText]
   }

   _GetJScripObject()  {
      VarSetCapacity(tmpFile, ((MAX_PATH := 260) - 14) << !!A_IsUnicode, 0)
      DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
      
      FileAppend,
      (
      <component>
      <public><method name='eval'/></public>
      <script language='JScript'></script>
      </component>
      ), % tmpFile
      
      JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
      FileDelete, % tmpFile
      JSON._AddMethods(JS)
      Return JS
   }

   _AddMethods(ByRef JS)  {
      JScript =
      (
         Object.prototype.GetKeys = function () {
            var keys = []
            for (var k in this)
               if (this.hasOwnProperty(k))
                  keys.push(k)
            return keys
         }
         Object.prototype.IsArray = function () {
            var toStandardString = {}.toString
            return toStandardString.call(this) == '[object Array]'
         }
      )
      JS.("delete ActiveXObject; delete GetObject;")
      JS.(JScript)
   }

   _CreateObject(ObjJS)  {
      res := ObjJS.IsArray()
      if (res = "")
         Return ObjJS
      
      else if (res = -1)  {
         obj := []
         Loop % ObjJS.length
            obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
      }
      else if (res = 0)  {
         obj := {}
         keys := ObjJS.GetKeys()
         Loop % keys.length
            k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
      }
      Return obj
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

333

Re: AHK: Регулярные выражения

DD пишет:

Регулярно выражаясь, как задать в исключаемом перечне (в этом: [^символы]) совпадение не по одному, а  целиком по двум, трём символам (тег, например)?

Использовал ((?!НЕЭТО).)*, но выяснилось, что шаблон иногда отказывает. Имеется ли надежный аналог для AHK-скриптов?

334

Re: AHK: Регулярные выражения

Была инфа, что эффективней записывать этот шаблон следующим образом: (?:(?!НЕЭТО).)*, но так на AHK не работает.

335 (изменено: DD, 2018-10-24 20:44:33)

Re: AHK: Регулярные выражения

Следующее выражение означает один любой символ из тех, которых нет в перечне: [^НЕЭТО]*. При использовании, перебор остановится на любой из перечисленных букв.
А нужен вариант выражения для исключения сразу по группе символов, а не по одному, как выше. То есть, вариант для выражений ((?!НЕЭТО).)* и (?:(?!НЕЭТО).)*, которые не подходят.

336

Re: AHK: Регулярные выражения

stealzy, а если конкретнее, с примерами?))

337

Re: AHK: Регулярные выражения

Так понял, нужно что-то вроде этого:

str := "1ab2cd3ef"
RegExMatch(str, "\d(?!ab|cd)", match)
MsgBox, % match

Пример получает из строки цифру, после которой нет ab или cd.

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

338 (изменено: DD, 2018-10-25 00:50:36)

Re: AHK: Регулярные выражения

stealzy, про вперед смотрящие я знаю и иногда использую. Интересовало, как этот принцип применить к исключению по группе символов — как если бы это был один символ, в отличие от символа из перечня. Суть изложенного еще до награмождений была в указании разницы между известным шаблоном для поиска по одному символу ([^x]), и двумя вариантами шаблона с тем же принципом для поиска по группе символов (((?!НЕЭТО).)* || (?:(?!НЕЭТО).)*), с просьбой подсказать третий вариант. К примеру, ниже надо найти то, что для наглядности выделено капслоком:

str := 
(
</div></div></div></div></div></div><div></div><DIV ID="COMPOSER-123456789"><FORM><INPUT /><INPUT /><LABEL>_</LABEL><TABLE><TBODY><TR><TD><DIV><TABLE><TBODY><TR><TD><TEXTAREA ID="COMPOSERINPUT"></TEXTAREA></TD></TR></TBODY></TABLE></DIV></TD><TD><DIV><INPUT /></DIV></TD></TR></TBODY></TABLE></FORM><FORM><INPUT /><INPUT /><SPAN><INPUT /><SPAN></SPAN><INPUT /></SPAN></FORM></DIV></DIV></DIV></DIV><DIV><DIV><DIV><IMG /><DIV><DIV><A>_</A><A>_</A><A>_</A></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV><DIV><A>_</A></DIV></DIV></div></div></body></html>
)
str := RegExReplace(str, "s)((<div[^>]*>)+)?<div[^>]* id=""composer[^""]*""><form((?!<abbr>).)*</a></div></div>", "")
MsgBox, % str

Почему-то на этом примере сама по себе неэффективная конструкция ((?!НЕЭТО).)*, не сработает (в отличие, скажем, от Notepad++). Как здесь применимы вперед смотрящие?

teadrinker, вроде, (?!<abbr>)* тоже не отработает при поиске ОТ и ДО, исключая указанный тег.

339

Re: AHK: Регулярные выражения

DD, конструкция (?!<abbr>)* не имеет смысла. Что она у вас означает?

DD пишет:

ниже надо найти то, что для наглядности выделено капслоком

Не понятно, по какому принципу вы хотите искать этот текст. Чего именно после него не должно быть? Объясните на словах.

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

340 (изменено: DD, 2018-10-25 01:26:31)

Re: AHK: Регулярные выражения

teadrinker, задача найти от <DIV ID="COMPOSER — до </A></DIV></DIV>, с условием, чтобы между ними не было тега <abbr>.

341 (изменено: teadrinker, 2018-10-25 03:05:59)

Re: AHK: Регулярные выражения

str =
(
</div><DIV ID="COMPOSER-123456789">этот текст<abbr>не должен быть найден</A></DIV></DIV></div></div><DIV ID="COMPOSER-123456789">этот текст нужно найти</A></DIV></DIV></a></div></div></div><abbr></a></div></div>
)
RegExMatch(str, "is)<DIV ID=""COMPOSER((?!<abbr>).)*?</a></div></div>", match)
MsgBox, % match
str = 
(
</div></div></div></div></div></div><div></div><DIV ID="COMPOSER-123456789"><FORM><INPUT /><INPUT /><LABEL>_</LABEL><TABLE><TBODY><TR><TD><DIV><TABLE><TBODY><TR><TD><TEXTAREA ID="COMPOSERINPUT"></TEXTAREA></TD></TR></TBODY></TABLE></DIV></TD><TD><DIV><INPUT /></DIV></TD></TR></TBODY></TABLE></FORM><FORM><INPUT /><INPUT /><SPAN><INPUT /><SPAN></SPAN><INPUT /></SPAN></FORM></DIV></DIV></DIV></DIV><DIV><DIV><DIV><IMG /><DIV><DIV><A>_</A><A>_</A><A>_</A></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV><DIV><A>_</A></DIV></DIV></div></div></body></html>
)
RegExMatch(str, "is)<DIV ID=""COMPOSER((?!<abbr>).)*?</a></div></div>", match)
MsgBox, % match
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder
+ DD

342 (изменено: DD, 2018-10-25 12:12:44)

Re: AHK: Регулярные выражения

teadrinker, спасибо! Получается, дело было в неуказанной опции «is)», но с которой заработал в т.ч. валидный вариант поиска с исключением «(?:(?!<abbr>).)*».
Объяснения по сочетанию «is)» не нашёл — что оно означает? Разве отдельный модификатор «s)» не игнорирует регистр символов?

343

Re: AHK: Регулярные выражения

Странно, как вы это могли не заметить:
http://www.script-coding.com/AutoHotkey/RegExMatch.html

344

Re: AHK: Регулярные выражения

По переводным статьям всё же лучше не изучать, там далеко не всё.

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

345

Re: AHK: Регулярные выражения

Начать изучать имхо проще по переводной статье.
А после ее понимания уже почитать на английском.

346

Re: AHK: Регулярные выражения

Я делаю ровно наоборот. Читаю статьи по программированию всегда на английском, и только если что-то совсем непонятно, ищу аналоги на русском.

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

347 (изменено: DD, 2018-10-25 14:05:48)

Re: AHK: Регулярные выражения

Malcev, о значении модификаторов по отдельности имел представление — непонятно, как они работают в объединенном виде.

А вот так с "вперед/назад смотрящими" получилось:

str = 
(
</div></div></div></div></div></div><div></div><DIV ID="COMPOSER-123456789"><FORM><INPUT /><INPUT /><LABEL>_</LABEL><TABLE><TBODY><TR><TD><DIV><TABLE><TBODY><TR><TD><TEXTAREA ID="COMPOSERINPUT"></TEXTAREA></TD></TR></TBODY></TABLE></DIV></TD><TD><DIV><INPUT /></DIV></TD></TR></TBODY></TABLE></A></DIV></DIV>sss</FORM><FORM><INPUT /><INPUT /><SPAN><INPUT /><SPAN></SPAN><INPUT /></SPAN></FORM></DIV></DIV></DIV></DIV><DIV><DIV><DIV><IMG /><DIV><DIV><A>_</A><A>_</A><A>_</A></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV><DIV><A>_</A></DIV></DIV></div></div></body></html>
)
RegExMatch(str, "is)<DIV ID=""composer[^>]*><form(?!abbr>)((.(?!abbr>)).*)(?=.*</a></div></div>)", match)
MsgBox, % match

348

Re: AHK: Регулярные выражения

DD пишет:

непонятно, как они работают в объединенном виде.

Значит невнимательно читали:

Например, шаблон "im)abc" будет искать строку abc с опциями нечувствительности к регистру и многострочности (скобку можно опускать, если опций нет)

349

Re: AHK: Регулярные выражения

А что, при поиске точки — с опцией s) — учитывается регистр?

350

Re: AHK: Регулярные выражения

Опция "s" к регистру и поиску точки никакого отношения не имеет.

351

Re: AHK: Регулярные выражения

К примеру, я указал: искать от <DIV ID="COMPOSER — до </A></DIV></DIV>, с условием, чтобы между ними не было тега <abbr>. При этом, и <DIV ID="COMPOSER и </A></DIV></DIV>, находятся в нижнем регистре и в моём шаблоне и в тексте. Так почему должно иметь значение регистр того, что между ними (точки)?

352

Re: AHK: Регулярные выражения

Приведите короткий пример.
Точка может быть любым символом вне зависимости от регистра.

353 (изменено: DD, 2018-10-25 14:40:01)

Re: AHK: Регулярные выражения

Выше они рассматривались. Вот так, в зависимости от разницы опций is/s — работает/не работает:

str = 
(
</div></div></div></div></div></div><div></div><DIV ID="COMPOSER-123456789"><FORM><INPUT /><INPUT /><LABEL>_</LABEL><TABLE><TBODY><TR><TD><DIV><TABLE><TBODY><TR><TD><TEXTAREA ID="COMPOSERINPUT"></TEXTAREA></TD></TR></TBODY></TABLE></DIV></TD><TD><DIV><INPUT /></DIV></TD></TR></TBODY></TABLE></FORM><FORM><INPUT /><INPUT /><SPAN><INPUT /><SPAN></SPAN><INPUT /></SPAN></FORM></DIV></DIV></DIV></DIV><DIV><DIV><DIV><IMG /><DIV><DIV><A>_</A><A>_</A><A>_</A></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV><DIV><A>_</A></DIV></DIV></div></div></body></html>
)
RegExMatch(str, "is)<DIV ID=""COMPOSER(?:(?!<abbr>).)*</a></div></div>", match)
MsgBox, % match

354

Re: AHK: Регулярные выражения

У вас же всё капслоком прописано.

RegExMatch(str, "<DIV ID=""COMPOSER(?:(?!<abbr>).)*</A></DIV></DIV>", match)

355 (изменено: DD, 2018-10-25 15:00:04)

Re: AHK: Регулярные выражения

Дело в том, что на реальном примере из файла, в котором, как и в шаблоне, всё было в нижнем регистре — не работало. Но теперь понял, что помимо is — нужна ещё точка перед последней звездочкой: «(?:(?!НЕЭТО).).*».

356

Re: AHK: Регулярные выражения

Как одним выражением находить слово, и слово с тэгами? —

«слово»
«сл<em>о</em>во»

357

Re: AHK: Регулярные выражения

Как находить только кириллицу, в которой также может присутствовать единица или англ. буква I? Пробовал в т.ч. так: «[А-Яа-яЁёI1]+», но всё не то.

358

Re: AHK: Регулярные выражения

А, так вроде надо было:

\b([А-Яа-яЁёI1][А-Яа-яЁёI1]*)\b

359 (изменено: DD, 2019-03-26 00:43:28)

Re: AHK: Регулярные выражения

Как настроить выражение, чтобы не захватывалось содержимое внутри тегов? —

Str = 
(
^journalist COLUMNS Released  accuses own lawyers of political show    
COLUMNS Political stalem ate123456789 injjkk Europe    
Frankly, had Masoud Barzani foreseen the course of developments in the recent period, he definitely would have given up the idea of holding an independence referendum. With the public's pressure and expectations regarding the referendum, Barzani went to the polls to prove his leadership. • Yet, what happened over the past 10 days jeopardized his position in the Kurdistan region, let alone consolidating his leadership <p> <a href="http://www.bibliotecapleyades.net/sociopolitica/esp_sociopol_denver02.htm" rel="nofollow"></a><a href="http://www.bibliotecapleyades.net/sociopolitica/e" rel="nofollow">http://www.bibliotecapleyades.net/sociopolitica/e</a>&#8230; </p> But how did the developments end up here? How did Barzani make such wrong calculations what did he depend on? And most importantly, what is awaiting the Iraqi Kurdistan Regional Government (KRG) from now on?
While aspiring to make Kirkuk the capital city of Kurdistan$ It plays out almost as a parody. Bill Nye has certainly become very judgmental, intolerable and rude in his own right.

)
StartPos := 1
While StartPos := RegExMatch(Str, "(.{1,500}.+?([,;:—\?\!\n\.]+\s*|$))", Found, StartPos) + StrLen(Found)
   MsgBox, %Found1%

360

Re: AHK: Регулярные выражения

А что должно захватываться?

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

361 (изменено: DD, 2019-03-26 01:30:45)

Re: AHK: Регулярные выражения

Захватываться должно вне тегов — до перечисленных символов, когда они есть. Если не захватится — тоже результат).

362

Re: AHK: Регулярные выражения

Я не очень понял вашу регулярку. Можно просто теги удалить — останется то, что вне их.

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

363 (изменено: DD, 2019-03-26 02:08:30)

Re: AHK: Регулярные выражения

Там сначала захватывается от 1 до 500 символов, и уже после этого ищется ближайший перечисленный стоп-символ (что позволяет не выходить за заданный лимит символов). Здесь был разговор — viewtopic.php?pid=125492#p125492. К примеру, ниже после первого слова "journalist" и до самого конца, текст представляет собой условный тег. И задача в том, чтобы поиск останавливался на слове журналист, не заходя в пределы ломаных скобок —

Str = 
(
^journalist <COLUMNS Released  accuses own lawyers of political show    
COLUMNS Political stalem ate123456789 injjkk Europe    
Frankly, had Masoud Barzani foreseen the course of developments in the recent period, he definitely would have given up the idea of holding an independence referendum. With the public's pressure and expectations regarding the referendum, Barzani went to the polls to prove his leadership. • Yet, what happened over the past 10 days jeopardized his position in the Kurdistan region, let alone consolidating his leadership But how did the developments end up here? How did Barzani make such wrong calculations what did he depend on? And most importantly, what is awaiting the Iraqi Kurdistan Regional Government (KRG) from now on?
While aspiring to make Kirkuk the capital city of Kurdistan$ It plays out almost as a parody. Bill Nye has certainly become very judgmental, intolerable and rude in his own right.>

)
StartPos := 1
While StartPos := RegExMatch(Str, "(.{1,500}.+?([,;:—\?\!\n\.]+\s*|$))", Found, StartPos) + StrLen(Found)
   MsgBox, %Found1%

364

Re: AHK: Регулярные выражения

DD пишет:

чтобы поиск останавливался на слове журналист

Именно останавливался, или чтоб продолжался после тега?

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

365

Re: AHK: Регулярные выражения

Останавливался.

366 (изменено: teadrinker, 2019-03-26 02:56:03)

Re: AHK: Регулярные выражения

Замените первую и вторую точки на [^<]

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

367 (изменено: DD, 2019-03-26 03:53:24)

Re: AHK: Регулярные выражения

Если я правильно заменил, так захватывается текст из тега, — а нужен тот, что перед тегом, чтобы текст не делился внутри тега, но перед ним.

368

Re: AHK: Регулярные выражения

Да, дезинформировал. Если нужно, чтобы поиск останавливался на первом теге, можно просто предварительно удалить всё, начиная с первого тега.

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

369

Re: AHK: Регулярные выражения

Но удаленное потом будет нужно, чтобы продолжить после тега.

370

Re: AHK: Регулярные выражения

Так вы же сказали, что нужно, чтобы останавливался? Если нет, тогда предварительно удалите все теги:

MsgBox, % Str := RegExReplace(Str, "<[^>]+>")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

371

Re: AHK: Регулярные выражения

А в выражении это нельзя предусмотреть, так как если удалить теги, это уже не будет HTML).

372

Re: AHK: Регулярные выражения

Так вы же их не насовсем удаляете, только для поиска. Сохранять с удалёнными тегами не нужно.

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

373 (изменено: DD, 2019-03-29 18:03:01)

Re: AHK: Регулярные выражения

Как для части выражения — <p><strong>.{1,150}[^\.]</strong></p> — правильно задать обработку только в случае, если содержимое тегов короче 150 символов и не заканчивается точкой?

post_only=
(
<p><strong>The YouTube channel of&nbsp;an artist named That Poppy has been mystifying viewers for years. Behind the weirdness of her videos is a disturbing story: The mind control of a young pop star.</strong></p>

<p><strong>The YouTube channel of&nbsp;an artist named.</strong></p>

<p><strong>The YouTube channel of&nbsp;an artist named</strong></p>

<p><strong>The YouTube channel of&nbsp;an artist named
</strong></p>

)
match := ""
while RegExMatch(post_only, "iO)(<h1|<h2|<h3|<h4|<h5|<p><strong>.{1,150}[^\.]</strong></p>)", match, match ? match.Pos + match.Len + 18 : 1)
   post_only := RegExReplace(post_only, match[0], "<a name=""vc_" . A_Index . """></a>" . match[0],, 1, match.Pos)

MsgBox % post_only

374 (изменено: KusochekDobra, 2019-03-29 19:42:28)

Re: AHK: Регулярные выражения

Не отказывайте себе в удовольствии, обрабатывая строки только регулярными выражениями. Есть и другие способы получать из строки информацию:


post_only =
(
<p><strong>The YouTube channel of&nbsp;an artist named That Poppy has been mystifying viewers for years. Behind the weirdness of her videos is a disturbing story: The mind control of a young pop star.</strong></p>

<p><strong>The YouTube channel of&nbsp;an artist named.</strong></p>

<p><strong>The YouTube channel of&nbsp;an artist named</strong></p>

<p><strong>The YouTube channel of&nbsp;an artist named
</strong></p>

)
For i, item in DoMatch(post_only, "<p><strong>") {
	RegExMatch(item, "<p><strong>(.*)</strong></p>", m)
	if (( len := StrLen(m1)) < 150 && (lastChar := SubStr(m1, len)) != ".")
		MsgBox % Format("Удачно срослось!`nВсего '{}' символов и последний '{}'`n`n'{}'", len, lastChar, m1)
	else
		MsgBox % Format("Не срослось. :(`nВсего '{}' символов и последний '{}'`n`n'{}'", len, lastChar, m1)
}
ExitApp

DoMatch(str, reg_ex) {
	arr := [], p1 := p2 := 1, match := ""
	While (p2 := RegExMatch(str, reg_ex, match, p2 + StrLen(match))) {
		(A_Index > 1 && arr.Push( SubStr(str, p1, p2 - p1) ))
		p1 := p2
	} arr.Push( SubStr(str, p1, StrLen(str) - p1) )
	Return arr
}

lastChar не будет получен, если первое условие в if возвращает false.

+ DD

375

Re: AHK: Регулярные выражения

DD пишет:
(<h1|<h2|<h3|<h4|<h5|<p><strong>.{1,150}[^\.]</strong></p>)

Я не понял, что это должно означать. Между чем и чем тут выбор? Зачем весь паттерн взят в скобки?

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

376

Re: AHK: Регулярные выражения

KusochekDobra
К сожалению, удовольствие расписывать такие функции мне не вполне доступно, отчего и пытался удовольствоваться уточнением регулярки)).

teadrinker
Это отсюда. Ищется начало тегов HEADER, либо целый тег параграфа по условию, с добавкой флагов перед ними. А скобки на всякий случай — потому что используется знак перечисления вариантов «|». В любом случае, все выражение окажется в переменной match.

377

Re: AHK: Регулярные выражения

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

DD пишет:

используется знак перечисления вариантов «|»

Ну и какие варианты там перечисляются?

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

378

Re: AHK: Регулярные выражения

Перечисляются варианты тегов HEADER (<h1, <h2 ...) и содержимое тега параграфа (<p>...</p>).

379

Re: AHK: Регулярные выражения

В смысле, устроит любой текст, начинающийся с <h1 и до самого конца?

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

380

Re: AHK: Регулярные выражения

Для тегов HEADER достаточно расставлять флаги, исходя из начальных названий тегов, но содержимое <p><strong>...</strong></p> уточняется полностью, чтобы выяснить длину их содержимого и наличие точки на конце.

381

Re: AHK: Регулярные выражения

DD пишет:

Для тегов HEADER достаточно расставлять флаги

Мне эта фраза ни о чём не говорит. Давайте лучше на каком-то более простом примере, типа "abcdefgh".

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

382

Re: AHK: Регулярные выражения

Так ведь на изначальном примере понятно, что нужно расставить <a name="vc_\d+"></a> перед фрагментами начальных тегов <h1, <h2, <h3, <h4, <h5. А в случае с <p><strong> — только когда их содержимое короче 150 символов и не содержит точки на конце.

<a name="vc_\d+"></a> в том коде уже расставляются — нужно лишь уточнить фрагмент шаблона с «<p><strong>.{1,150}[^\.]</strong></p>».

383

Re: AHK: Регулярные выражения

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

RegExMatch(post_only, "iO)<h1|<h2|<h3|<h4|<h5|<p><strong>[^<]{1,148}[^\.]</strong></p>", match, match ? match.Pos + match.Len + 18 : 1)

Это если я правильно понял фразу «только когда их содержимое короче 150 символов», то-есть максимум 149.

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

384

Re: AHK: Регулярные выражения

С доп. тегами внутри, не срабатывает:

post_only=
(
<p><strong>The YouTube <b>channel</b> of&nbsp;an artist named That Poppy has been mystifying viewers for years. Behind the weirdness of her videos is a disturbing story: The mind control of a young pop star.</strong></p>

<p><strong>The YouTube <b>channel</b> of&nbsp;an artist named.</strong></p>

<p><strong>The YouTube <b>channel</b> of&nbsp;an artist named</strong></p>

<p><strong>The YouTube <b>channel</b> of&nbsp;an artist named</strong></p>

)
match := ""
while RegExMatch(post_only, "iO)<h1|<h2|<h3|<h4|<h5|<p><strong>[^<]{1,148}[^\.]</strong></p>", match, match ? match.Pos + match.Len + 18 : 1)
   post_only := RegExReplace(post_only, match[0], "<a name=""vc_" . A_Index . """></a>" . match[0],, 1, match.Pos)

MsgBox % post_only

385 (изменено: DD, 2019-03-30 14:35:06)

Re: AHK: Регулярные выражения

Вот так почему-то обрабатываются те, что с точкой на конце, хотя знаки «?!» должны вроде отрицать последующее —

iO)<p><strong>.{1,150}(?!\.</strong></p>)

386

Re: AHK: Регулярные выражения

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


Str = 
(
<p>That being said, is That Poppy actually under mind control or is it all a big act? Is Titanic Sinclair an actual MK <a "https//vigilantcitizen.com/musicbusiness/poppy-youtube-star-illuminati-mind-control"> handler </a> or is he simply tapping into “conspiracy” fodder? Are we witnessing actual mind control or a clever marketing <i>strategy</i>? Difficult to say. One thing is for sure, That Poppy is actually tied to a high-level record <a "https://vigilantcitizen.com/musicbusiness"> label </a> where people do not play around. Also, and more importantly, That Poppy is another proof that this is basically the one kind of messages and symbolism that is <b>allowed to be associated</b> with her, and most of pop culture. They want this Illuminati mind control symbolism to be what is <a "https//vigilantcitizen.com"> cool, viral, trendy, edgy </a>, experimental and so forth. While some might see That Poppy as an innovative thing, she is actually repeating the same story that <a 001> was being told </a> by nearly 10 years ago – and by countless others afterward. The only thing that changed is the overall tone and delivery format which <a "https//vigilantcitizen.com/musicbusiness/poppy-youtube-star-illuminati-mind-control"> was adapted </a>  to the viewing habits of today’s youth who love short, viral, absurd videos. However, in the end, the message is the same: The Illuminati is celebrated as the “highlight of these artists’ lowlifes” … until the elite is done with them.</p>

)
StartPos := 1
While StartPos := RegExMatch(Str, "s)(.{1,700}.+?([,:;—\?\!\n\.]+\s*|$))", Found, StartPos) + StrLen(Found)
MsgBox, % Found1

387 (изменено: teadrinker, 2019-03-30 16:31:34)

Re: AHK: Регулярные выражения

DD пишет:

С доп. тегами внутри, не срабатывает

Замените [^<] на (.(?!</strong></p>)).

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

388 (изменено: DD, 2019-03-31 01:56:35)

Re: AHK: Регулярные выражения

Del

389

Re: AHK: Регулярные выражения

Каким будет выражение, которое захватит начальные подряд идущие теги, с возможными пробелами и табуляцией между/перед ними, напр.:

 	 <p>   <a href="4rthmurla.jpg"><blockquote>

или

<p><a href="4rthmurla.jpg"><blockquote>

match1 =
(
 	 <p>   <a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
match1 := RegExReplace(match1, "m`a)^((<[^>]*>(\s|\t)?)+)+", "$1")
msgbox % match1

390

Re: AHK: Регулярные выражения

"Начальные, подряд-идущие" — первые три?


match1 =
(
	 <p>   <a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
result := RegExMatch(match1, "<\w+>([<\s\w=""\.]+>){0,2}", m)
msgbox % "'" m "'"

391 (изменено: DD, 2019-04-02 14:06:46)

Re: AHK: Регулярные выражения

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

	 <p><p>   <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>   

392

Re: AHK: Регулярные выражения

Захватывает до момента, пока не встретит символ закрывающегося тега "/":


str =
(
	 <p><p>   <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
RegExMatch(str, "([<\s\w=""\.>]+)+(?!\/)", m)
msgbox % "'" m "'"

393

Re: AHK: Регулярные выражения

KusochekDobra, так понимаю, что

DD пишет:

начальные подряд идущие теги

это теги и их содержимое до текста, который расположен вне тега — "j".

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

394

Re: AHK: Регулярные выражения

Вероятно и так. Благодарю. Было бы неплохо сразу про такие "маркеры" пояснять. Мне подумалось, что под "начальные", подразумевается "открывающие".


str =
(
	 <p><p>   <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
RegExMatch(str, "(<[\s\w=""\.]+>([\s]+)?)+(?!\w+)", m)
msgbox % "'" m "'"
+ DD

395

Re: AHK: Регулярные выражения

Почему-то, стоит вклинить где-нибудь вначале <b>bold</b> — и захват до открывающего <b> не происходит —

str =
(
	 <p><p>   <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpgdd"><b>bold</b><a href="4rthmurla.jpg">                                <blockquote></blockquote>(((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
RegExMatch(str, "(<[^>]*>([\s]+)?)+(?!\w+)", m)
msgbox % m

Может есть более простой способ надежно захватить сплошные теги (с возможными пробелами-табуляцией между ними) до первого текста?

396

Re: AHK: Регулярные выражения

Прошу прощения. Так, вроде похоже:


str =
(
	 <p><p>   <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpgdd"><b>bold</b><a href="4rthmurla.jpg">                                <blockquote></blockquote>(((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
RegExMatch(str, "(<[\s\w=""\.]+>([\s]+)?)+(?<!\w)", m)
msgbox % m
+ DD

397

Re: AHK: Регулярные выражения

Я бы не стал определять содержание тега, как [\s\w=""\.]+:

str =
(
    <p><p>   <a href="http://mysite.com/4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpgdd"><b>bold</b><a href="4rthmurla.jpg">                                <blockquote></blockquote>(((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
RegExMatch(str, "(<[\s\w=""\.]+>([\s]+)?)+(?<!\w)", m)
msgbox % m

Как вариант:

str =
(
    <p><p>   <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpgdd"><b>bold</b><a href="4rthmurla.jpg">                                <blockquote></blockquote>(((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
MsgBox, % "|" . RegExReplace(str, "(?<=>)\s*[^\s<].*") . "|"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

398 (изменено: DD, 2019-04-03 15:16:36)

Re: AHK: Регулярные выражения

Интересно, почему начальные теги не находятся в первой группе ($1), несмотря на то, что заключены в общие скобки? —

str =
(
    <p><p>   <a><a><a><a></b><b>bold</b>bold</b><a>                                <blockquote></blockquote> (((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
str := RegExReplace(str, "m`a)^((<[^>]*>([\s]+)?)+(?<!\w))(.*)$", "$1$2$3-----------------$4")
msgbox % str

399 (изменено: DD, 2019-04-03 15:15:29)

Re: AHK: Регулярные выражения

Как в следующем формате получать определенные группы до начальных тегов — и всего остального в строке? —

str =
(
    <p><p>   <a><a><a><a></b><b>bold</b>bold</b><a>                                <blockquote></blockquote> (((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>   
)
str := RegExReplace(str, "m`a)((?<=>)\s*[^\s<].*)(.*)$", "$1-----------------$2-----------------$3-----------------$4-----------------$5")
msgbox % str

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

400

Re: AHK: Регулярные выражения

DD, поясните, зачем у вас всё время используются опции m`a ?

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