1 (изменено: Turambar, 2017-03-02 21:17:17)

Тема: AHK: Несколько результатов в многострочной регулярке

Здравствуйте. Вопрос следующего характера. Как можно заставить многострочную регулярку вывести все совпадения?

В указанном примере выводится только первое значение (разумеется!). Но как сделать запись в файл всех? Поместить регулярку в какой-то цикл? Но как? Ведь построчный цикл чтения (Loop, Read,) тут уже не подойдёт, поскольку регулярка многострочная.

Количество блоков <tr> заранее неизвестно. От 0 до тысячи.

text = 
(
<tr>
тест 4
</tr>

<tr>
тест 3
</tr>

<tr>
тест 1
</tr>
)

pattern=<tr>.*?тест (.).*?</tr>
if RegExMatch(text, pattern, line)
   FileAppend, %line1%`n, %A_ScriptDir%/test.txt
return

Должно быть в файле на выходе:


4
3
1

2

Re: AHK: Несколько результатов в многострочной регулярке

Turambar
Почему тема в Games? Перенесено в основной раздел.

text =
(
<tr>
тест 4
</tr>

<tr>
тест 3
</tr>

<tr>
тест 1
</tr>
)

Pos = 1
While Pos := RegExMatch(text, "<tr>\nтест (\d+)\n</tr>", Match, Pos+StrLen(Match))
  S := S "`n" Match1
FileOpen("test.txt", "w").Write(SubStr(S, 2))

; Либо:

RegExp := ComObjCreate("VBScript.Regexp")
RegExp.Pattern := "<tr>\nтест (\d+)\n</tr>"
RegExp.Global := 1, Col := RegExp.Execute(Text)
Loop, % Col.Count
  S := S "`n" Col.Item(A_Index-1).Submatches(0)
FileOpen("test.txt", "w").Write(SubStr(S, 2))

3 (изменено: teadrinker, 2017-03-03 12:19:27)

Re: AHK: Несколько результатов в многострочной регулярке

text = 
(
<tr>
тест 4
</tr>

<tr>
тест 3
</tr>

<tr>
тест 1
</tr>
)

MsgBox, % RegExReplace(text, "m`as)^(тест (\d+)$(?=.*(^тест \d+$))?|.*?)(?(3)|(\R|$))", "$2")

Или, если в конце строки "тест 1" не обязательно число, а просто один символ:

RegExReplace(text, "m`as)^(тест (.)$(?=.*(^тест .$))?|.*?)(?(3)|(\R|$))", "$2")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder