1 (изменено: Drugoy, 2013-07-18 15:03:23)

Тема: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

+ Disclaimer

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

У меня возникли трудности при составлении сложного шаблона регулярных выражений для команды RegExMatch.
См. строку №5:

For Process In ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
{
    input = "c:\path.ahk\folder\noteven.ahk.exe" "c:\fake\parameter\with\path\to.ahk" ; эта и следующая строки используются в тестовых целях: с их помощью можно подделать реально обрабатываемый Process.CommandLine каким-то значением.
    Process.CommandLine := input ; приходится использовать временную переменную input, т.к. нельзя просто взять и назначить Process.CommandLine'у значение через знак равенства, а если назначать через := - то нужно вручную "экранировать" кавычки.
    If RegExMatch(Process.CommandLine, "[^\\]+\.ahk(?=\W*)", tempVar)
        Msgbox %A_Index%: |%tempVar%|
    Else
        Msgbox the input didn't pass the regexmatch!
}
; Примеры 1-4 должны проходить RegExMatch, примеры 5-6 - не должны. Во всех примерах добавлены пайпы по краям в качестве разделителей: просто чтобы можно было заметить на конце пробел после кавычки в примере №4. Сами пайпы не являются частью тестируемого input'а.
;
; Примеры:
; |"C:\Program Files\AutoHotkey\AutoHotkey.exe" /restart "C:\Program Files\AutoHotkey\Scripts\In Development\DrugWinManager (with GDI+ pin).ahk"|
; |"C:\Program Files\AutoHotkey\AutoHotkey.exe"  "C:\Program Files\AutoHotkey\Scripts\In Development\Remap ALT+F4 to CTRL+W.ahk"|
; |"C:\Program Files\AutoHotkey\AutoHotkey.exe"  "C:\Program Files\AutoHotkey\Scripts\In Development\PerAppVolCtrl\PerAppVolumeControl.ahk"|
; |"C:\Program Files\AutoHotkey\AutoHotkey.exe" "C:\Users\Администратор\Desktop\puewtest.ahk" |
; |"C:\Path\to\evil\virus.exe" "C:\this\is a\fake parameter\to bypass the regexp.ahk"|
; |"C:\Path\to\evil\virus.exe" "C:\Program files\Autohotkey.exe" "C:\all parameters\are fake and just get ignored by virus.exe\to bypass the regexp.ahk"|

Проблема в том, что шаблон должен обрабатывать любую строку на входе так, что:
1. если она не является commandline'ом живого процесса ahk-скрипта - то она не должна подпадать под regexmatch шаблон (т.е. в tempvar записывается 0)
2. если шаблон распознаёт, что на входе у него commandline живого процесса ahk-скрипта, то он должен преобразовать его просто в имя этого скрипта: без пути к файлу скрипта, без каких-либо лишних символов (кавычек, пробелов, параметров запуска скрипта (например, /restart).

Сейчас у мой RegExMatch так составлен, что он хорошо справляется со 2-ым требованием, но не справляется с первым: он не умеет отличать процесс ahk от virus.exe запущенного с путём к .ahk как параметром командной строки.

+ Обходной вариант

Чтобы решить эту проблему - можно, конечно, использовать дополнительную проверку, но хотелось бы обойтись одним RegExMatch.

If (Process.ExecutablePath == A_AhkPath)    ; Свойство ExecutablePath содержит в себе только путь к исполняемому файлу процесса, так что это надёжная проверка.
    Process.CommandLine := RegExReplace(Process.CommandLine, "i)^.*\\|\.ahk\W*") . ".ahk"

Чтобы научить его отличать процессы ahk - нужно проверять на наличие в input'е содержимого переменной A_AhkPath, но так хитро, чтобы последний из примеров не проходил RegExMatch (т.к. там процесс всё-таки virus.exe)

И отдельная проблема это возможное наличие /restart между путём к ahk и путём к самому скрипту (см. пример №1).

Edit: serzh82saratov решил мою проблему, написав грамотный и сложный RegEx шаблон:

If RegExMatch(Process.CommandLine, "^(""|\s)*\Q" A_AhkPath "i)\E.*\\(?<Name>.*\.ahk)(""|\s)*$", Script)

2

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

А к чёрту - проще проверять (Process.ExecutablePath == A_AhkPath).
:-/

3 (изменено: serzh82saratov, 2013-07-18 12:52:15)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]


CommandLine = 
(
"C:\Program Files\AutoHotkey\AutoHotkey.exe" /restart "C:\Program Files\AutoHotkey\Scripts\In Development\DrugWinManager (with GDI+ pin).ahk"
 %A_Space% "C:\Program Files\AutoHotkey\AutoHotkey.exe"  "C:\Program Files\AutoHotkey\Scripts\In Development\Remap ALT+F4 to CTRL+W.ahk" %A_Space%  
"C:\Program Files\AutoHotkey\AutoHotkey.exe"  "C:\Program Files\AutoHotkey\Scripts\In Development\PerAppVolCtrl\PerAppVolumeControl.ahk" 
"C:\Program Files\AutoHotkey\AutoHotkey.exe" "C:\Users\Администратор\Desktop\puewtest.ahk"
"C:\Path\to\evil\virus.exe" "C:\this\is a\fake parameter\to bypass the regexp.ahk" 
"C:\Path\to\evil\virus.exe" "C:\Program files\Autohotkey.exe" "C:\all parameters\are fake and just get ignored by virus.exe\to bypass the regexp.ahk" 
)
Loop, parse, CommandLine, `n
    Msgbox % A_Index ". " (RegExMatch( A_LoopField, "^(""|\s)*\Q" A_AhkPath "\E.*\\(?<Name>.*\.ahk)(""|\s)*$"
    , Script) ? "|" ScriptName "|" : "False")
Pat := "^(""|\s)*\Q" A_AhkPath "\E.*\\(?<Name>.*\.ahk)(""|\s)*$"
For Process In ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") 
    if RegExMatch( Process.CommandLine, Pat, Script) 
        Msgbox % ScriptName  
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

4 (изменено: Drugoy, 2013-07-18 14:43:13)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

serzh82saratov
ну Вы и круты, спасибо большое)
Единственное, что я от себя добавил в Ваш шаблон - это настройку i) для второй группы в кавычках: ведь расширение у файла может быть написано и заглавными буквами, например: script.AHK

5 (изменено: serzh82saratov, 2013-07-18 16:07:57)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

"Si)^(""|\s)*\Q" A_AhkPath "\E.*\\(?<Name>.*\.ahk)(""|\s)*$"

Ещё добавьте S для производительности.

Drugoy пишет:

Единственное, что я от себя добавил в Ваш шаблон - это настройку i) для второй группы в кавычках

If RegExMatch(Process.CommandLine, "^(""|\s)*\Q" A_AhkPath "i)\E.*\\(?<Name>.*\.ahk)(""|\s)*$", Script)

Так у меня не работает... Опции указываются в начале шаблона

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

6

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

serzh82saratov,
да, спасибо за поправку и за добавку S :-)

7 (изменено: Drugoy, 2013-08-16 06:10:26)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Новый вопрос:
Есть текст на входе

content=imgURL: '{"data":{"id":"PmLVBds","title":null,"description":null,"datetime":1376618242,"type":"image\/png","animated":false,"width":22,"height":8,"size":130,"views":0,"bandwidth":0,"favorite":false,"nsfw":null,"section":null,"deletehash":"fvMC3agHAyPm2eu","link":"http:\/\/i.imgur.com\/PmLVBds.png"},"success":true,"status":200}'

как бы его по правильному распарсить так, чтобы на выходе получилось

content=http:\/\/i.imgur.com\/PmLVBds.png

или ещё лучше, если сразу в нормальную ссылку (с заменой http на https):

content=https://i.imgur.com/PmLVBds.png

Я делал так:

StringReplace, content, content, \/, /, All
RegExMatch(content, "U)http://(.*).png", content)
StringReplace, content, content, http://, https://

Мне этого хватало, т.к. раньше скрипт умел работать только с собственноручно сделанными скриншотами (и они все были в *.png формате), а теперь скрипт работает не только с собственными скриншотами, но и с любой графикой, поэтому расширение у файла может быть любое.
Я бы заменил в шаблоне png на [png|gif|bmp|jpg|jpeg|…|etc], но тогда он начнёт срабатывать на .com

Помогите, пожалуйста.

8 (изменено: serzh82saratov, 2013-08-16 12:21:31)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]


If RegExMatch(content, """link"":""http:\\/\\/(.*?png|gif|bmp|jpg|jpeg)""}", Match)
    Str := "https://" RegExReplace(Match1, "\\/", "/")
MsgBox % Str

чтобы на выходе получилось

Весь адрес:

If RegExMatch(content, """link"":""(http:\\/\\/.*?\\/.*?png|gif|bmp|jpg|jpeg)""}", Match)
    MsgBox % Match1
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

9

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

serzh82saratov,
спасибо большое! чего-то я вчера на ночь глядя не догадался добавить ""}" как часть, используемую в качестве якоря.

10

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

serzh82saratov,
а не подскажете в чём может быть дело?
Ваш код работает, добавляю все поддерживаемые расширения

If RegExMatch(imgURL, "i)""link"":""http:\\/\\/(.*?jpg|jpeg|png|gif|apng|tiff|tif|bmp|pdf|xcf)""}", Match)
        imgURL := "https://" RegExReplace(Match1, "\\/", "/")

и уже вот такой content не обрабатывается как надо:

content=imgURL: '{"data":{"id":"uj4r1gs","title":null,"description":null,"datetime":1376694268,"type":"image\/png","animated":false,"width":20,"height":12,"size":141,"views":0,"bandwidth":0,"favorite":false,"nsfw":null,"section":null,"deletehash":"iPyvoCT0CoACCaH","link":"http:\/\/i.imgur.com\/uj5r4gs.png"},"success":true,"status":200}'

11

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

В шаблоне была ошибка. Варианты расширений надо было заключить в скобки.

RegExMatch(Text, "i)""link"":""http:\\/\\/(.*?(jpg|jpeg|png|gif|apng|tiff|tif|bmp|pdf|xcf))""}", Match)
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

12

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

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

13 (изменено: Странникх, 2017-05-03 23:24:10)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

key2  := "Alt+Ctrl+Shift+Q"
MsgBox, % RegExReplace(key2, "(Alt)/(Shift)/(Ctrl)", "(!)-(+)-(^)")

Как заменить Alt на !, Shift на +, Ctrl на ^ и превратить последнюю кнопку (буквенного вида, например NumPadAdd или = ) в vk, удалив ненужные + между до этого?

Format("{vk{:X}}", GetKeyVK("Q"))

У нас может и не быть по условиям перечень модификаторов через +. То есть может быть key2  := "Q", ее тогда просто в формат.

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

key2  := "Alt+Ctrl+Shift+Q"
StringReplace, key2, key2, +, , All
StringReplace, key2, key2, Alt, !, All
StringReplace, key2, key2, Shift, +, All
StringReplace, key2, key2, Ctrl, ^, All
MsgBox, % RegExReplace(key2, "[^!+^]") Format("{vk{:X}}", GetKeyVK(RegExReplace(key2, "[!+^]", "")))

14

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Странникх
Да вроде норм должно работать. Мне в голову что-то изменить не приходит. Регулярками еще больше усложнять думаю не стоит.

15

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

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

Вопрос собственно по документации к RegEx. В справочнике сказано про шаблоны:

NikVasKo пишет:

. Точка соответствует любому отдельному символу (исключая символы новой строки: `r и `n). Например, ab. отвечает abc и abz и ab_

*Звездочка соответствует повторенному любое число раз или отсутствующему предыдущему элементу. Элементом может быть символ, символ из перечня, или подшаблон. Например, a* отвечает ab и aaab, а если строка вовсе не содержит "a", то шаблон даст пустой ответ в начале строки (в позиции 1).

ВсеЧтоУгодно: шаблон точка-звездочка .* является одним из самых необязательных шаблонов, поскольку он отвечает любой последовательности (даже пустой) любых символов (кроме `r и `n). Например, abc.*123 отвечает и abcВсеЧтоУгодно123 и abc123.

\s Отвечает любому из пробельных символов (одному), то есть space, tab, `r , `n. Наоборот, заглавная \S означает "любой из непробельных символов".

То есть дважды сказано, что точка не может означать пробельные символы, а именно: перевод строки. Для изображения перевода строки следует использовать \s в шаблоне. Тем не менее, такой код работает:

Var =
(
<TegABC>ABC</TegABC>

<MyTeg>
<TegLMN>LMN</TegLMN>
<OPQ>
RST
</MyTeg>

XYZ
)

Inner := RegExReplace(Var, "(.*)<MyTeg>(.*)</MyTeg>(.*)",  "$2")
Outer := RegExReplace(Var, "(.*)<MyTeg>(.*)</MyTeg>(.*)",  "$1" "$3")

MsgBox, %Inner%
MsgBox, %Outer%

Вопрос: это баг или изменения в новой версии AutoHotkey, или что я делаю не так?

16

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Просто объяснено немного криво. Имеется в виду, что точка не найдёт совпадения, если перевод строки именно такого типа — `r`n. Если перевод строки представлен только одним из этих символов или они не в этом порядке, совпадение будет найдено.

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

17

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Спасибо! Действительно, под шаблон (.*) подпадают разные виды переноса строки кроме `r`n.  Ради интереса сохранил эти переносы в файл и посмотрел программой WinHex:

`r        0D
`n       0A
`r`n    0D0A - используется в Блокноте
`n`r    0A0D

Затем попробовал применить шаблон к 5 разным примерам.

+ открыть спойлер
Var =
(
<MyTeg>1
RST
2</MyTeg>
)

VarR = <MyTeg>1`rRST`r2</MyTeg>
VarN = <MyTeg>1`nRST`n2</MyTeg>
VarRN = <MyTeg>1`r`nRST`r`n2</MyTeg>
VarNR = <MyTeg>1`n`rRST`n`r2</MyTeg>

Var   := RegExReplace(VarR,  "<MyTeg>(.*)</MyTeg>",  "$1")
VarR  := RegExReplace(VarR,  "<MyTeg>(.*)</MyTeg>",  "$1")
VarN  := RegExReplace(VarN,  "<MyTeg>(.*)</MyTeg>",  "$1")
VarRN := RegExReplace(VarRN, "<MyTeg>(.*)</MyTeg>",  "$1")
VarNR := RegExReplace(VarNR, "<MyTeg>(.*)</MyTeg>",  "$1")

MsgBox, %Var%
MsgBox, %VarR%
MsgBox, %VarN%
MsgBox, %VarRN%
MsgBox, %VarNR%

Шаблон сработал во всех случаях, кроме четвёртого, который как раз и есть `r`n. Значит это сочетание относится к пробельным символам? Или просто следует понимать, что это сочетание не попадает под определение "отдельный символ"?
Мой предыдущий пример сработал потому что содержимое переменной было записано в теле скрипта. А вот когда беру из текстового файла, возникает проблема.

Допустим в программе Блокнот видим такую запись:

000.txt пишет:

abc
<MyTeg>
RST
</MyTeg>
xyz

Скрипт

FileRead, OutputVar, 000.txt
NewStr := RegExReplace(OutputVar, "(.*)<MyTeg>(.*)</MyTeg>(.*)", "$2")
MsgBox, %NewStr%

не сработает.

Но если переделать исходник на

000.txt пишет:

abc <MyTeg> RST </MyTeg> xyz

, то есть заменить переносы строки пробелами, то RST исправно находится.

Какой же шаблон применить, когда нужно искать среди текста, содержащего перенос строки `r`n ?

18

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Имеется в виду, что точка без опции s, не может быть символом `r если после символа `r идет символ `n.

a = 1`r`n2
msgbox % RegExReplace(a, "1.`n")
msgbox % RegExReplace(a, "s)1.`n")

19

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Точка это любой символ в regex, в конкретном случае перевод строки идет за начало строки, которое символом просто не является. Каким боком тут вообще пробельные символы?

ypppu пишет:

посмотрел программой WinHex

Np++: Вид → Отображение символов
CR = `r, LF = `n. Кстати, сочетание `n`r не является стандартом ни в одном семействе ОС.

20

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Почему перевод строки символом не является? Как раз является.

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

21 (изменено: stealzy, 2017-10-12 13:32:45)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

stealzy пишет:

начало строки, которое символом просто не является

Ошибся, перевод строки идет за начало с опцией m).

s
DotAll. This causes a period (.) to match all characters including newlines (normally, it does not match newlines). However, when the newline character is at its default of CRLF (`r`n), two dots are required to match it (not one). Regardless of this option, a negative class such as [^a] always matches newlines.

Подробнее про точку и перевод строки в PCRE.

22

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

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

(всё что угодно ДО)(слово "Фамилия")(ЗДЕСЬ НУЖНАЯ ИНФОРМАЦИЯ)(Слово "</Data>")(всё что угодно ПОСЛЕ)

Я хочу извлечь нужную информацию. Потом перейду к (всё что угодно ПОСЛЕ) и продолжу дальше извлекать фамилии.

Сделал такой код, но в нём попадается сразу последняя фамилия.

+ открыть спойлер
TEMPVar = 
(
Всё_что_угодно_1
<Row>
<Row ss:AutoFitHeight="0" ss:Height="25" ss:StyleID="s72">
<Cell ss:MergeAcross="15" ss:StyleID="s27"><Data ss:Type="String">Фамилия Иванов</Data></Cell>
<Cell ss:MergeAcross="15" ss:StyleID="s27"><Data ss:Type="String">Разряд 1</Data></Cell>
</Row>
Всё_что_угодно_2
<Row>
<Row ss:AutoFitHeight="0" ss:Height="20" ss:StyleID="s22">
<Cell ss:MergeAcross="47" ss:StyleID="s87"><Data ss:Type="String">Фамилия Петров</Data></Cell>
<Cell ss:MergeAcross="47" ss:StyleID="s87"><Data ss:Type="String">Разряд 2</Data></Cell>
</Row>
Всё_что_угодно_3
<Row>
<Row ss:AutoFitHeight="0" ss:Height="25" ss:StyleID="s29">
<Cell ss:MergeAcross="25" ss:StyleID="s83"><Data ss:Type="String">Фамилия Сидоров</Data></Cell>
<Cell ss:MergeAcross="25" ss:StyleID="s83"><Data ss:Type="String">Разряд 3</Data></Cell>
</Row>
Всё_что_угодно_4
)

MsgBox, % RegExReplace(TEMPVar, "(.*)Фамилия(.*?)</Data>(.*)", "$2")

23

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

TEMPVar = 
(
Всё_что_угодно_1
<Row>
<Row ss:AutoFitHeight="0" ss:Height="25" ss:StyleID="s72">
<Cell ss:MergeAcross="15" ss:StyleID="s27"><Data ss:Type="String">Фамилия Иванов</Data></Cell>
<Cell ss:MergeAcross="15" ss:StyleID="s27"><Data ss:Type="String">Разряд 1</Data></Cell>
</Row>
Всё_что_угодно_2
<Row>
<Row ss:AutoFitHeight="0" ss:Height="20" ss:StyleID="s22">
<Cell ss:MergeAcross="47" ss:StyleID="s87"><Data ss:Type="String">Фамилия Петров</Data></Cell>
<Cell ss:MergeAcross="47" ss:StyleID="s87"><Data ss:Type="String">Разряд 2</Data></Cell>
</Row>
Всё_что_угодно_3
<Row>
<Row ss:AutoFitHeight="0" ss:Height="25" ss:StyleID="s29">
<Cell ss:MergeAcross="25" ss:StyleID="s83"><Data ss:Type="String">Фамилия Сидоров</Data></Cell>
<Cell ss:MergeAcross="25" ss:StyleID="s83"><Data ss:Type="String">Разряд 3</Data></Cell>
</Row>
Всё_что_угодно_4
)
; если нужна первая фамилия
MsgBox, % RegExReplace(TEMPVar, "s).*?Фамилия (.*?)<.*", "$1")

; если нужны все
while RegExMatch(TEMPVar, "sO)Фамилия (.*?)<", match, A_Index = 1 ? 1 : match.Pos + match.Len)
   MsgBox, % match[1]
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

24

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Спасибо! А как этот шаблон работает?

RegExReplace(TEMPVar, "s).*?Фамилия (.*?)<.*", "$1")

Я читаю так:
s).*? - Сколько угодно отдельных символов, включая `r`n. Но может и не быть ничего.
(.*?) - Сколько угодно отдельных символов. Но может и не быть ничего.
<.* - Знак "меньше", после которого идёт сколько угодно отдельных символов.

Во втором, отталкиваясь от начальной позиции найденного, создаётся массив. В него заносятся все найденные фамилии. Но что значит sO)?

25 (изменено: stealzy, 2017-10-15 23:09:07)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

http://www.exlab.net/files/tools/sheets/regexp/regexp.png
Нежадный - значит захвачено будет минимальное удовдетворяющее количество (там может быть еще один или больше знаков "<" после первого, жадный квант дойдет до последнего, нежадный остановится на первом).

ypppu пишет:

что значит sO)?

Как то неловко вам говорить, но все режимы работы описаны в справке .