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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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
Telegram jollycoder

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
Telegram jollycoder

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
Telegram jollycoder

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)?

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

26

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

ypppu пишет:

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

Mode 3 (match object).
https://autohotkey.com/docs/commands/RegExMatch.htm

27 (изменено: ypppu, 2017-10-15 23:51:08)

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

stealzy спасибо, правда ясности о ? не прибавилось.
По поводу справки - да, кончено. Я вообще по мере необходимости перевожу англоязычные статьи. Но когда посмотрел на RegEx, попробовал сперва спросить на форуме (обойтись малой кровью), ибо переводить нужно с пониманием, разбором примеров, а это долго.

28 (изменено: stealzy, 2017-10-15 23:24:21)

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

ypppu, не знаю как описать более точно, название нежадный даже само за себя говорит.
Рекомендую поиграться с этим шаблоном на сайтах - помощниках.
У меня стояла раньше программа RegexBuddy 3.6.1 которая также помогает составить regex и показывает как он работает.
Книгу Фридла рекомендую.

29

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

s значит то, что и раньше (точка — любой символ), а O — вот это, перевода на русский нет.

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

30

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

ypppu, чтобы добавилось ясности пробуйте на простейших примерах:

var = 1212
RegexMatch(var, ".*1", match)
msgbox % match
RegexMatch(var, ".*?1", match)
msgbox % match

31

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

Malcev, в первом случае идёт шаблон "любое число отдельных символов" и  "единичка";
во втором случае "любое число отдельных символов либо вообще ничего" и "единичка", верно?
Первый показывает 121, потому что перед единичкой обязательно должно что-то быть.
Второй показывает 1, потому что первая же единичка отвечает условиям. Вторая единичка тоже отвечает условиям, но мы ищем только первое совпадение.

32

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

ypppu пишет:

Первый показывает 121, потому что перед единичкой обязательно должно что-то быть.

Неверно.

ypppu пишет:

"любое число отдельных символов либо вообще ничего"

Это относится к обоим шаблонам, иначе было бы .+ .

33

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

И в первом и во втором идёт "любое число отдельных символов либо вообще ничего" и "единичка".
Но в первом случае шаблон жадный, поэтому берется последнее совпадение.
А во втором берется первое совпадение, так как стоит знак вопроса после *, тем самым превращается шаблон в нежадный.
Чтобы сделать такой шаблон - "любое число отдельных символов" и  "единичка",  надо "." заменить на "+".
И тогда в данном случе жадный и нежадный шаблоны будут идентичными, так как перед единичкой должен быть какой-либо символ.

var = 1212
RegexMatch(var, ".+1", match)
msgbox % match
RegexMatch(var, ".+?1", match)
msgbox % match

34

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

Спасибо за объяснения! Буду разбираться на свежую голову.

35

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

Вроде понял примеры от Malcev.

+ срабатывает на ≥1 символов
* срабатывает на ≥0 символов.
? указывает на необязательность предыдущего элемента (символа, символа из перечня или подшаблона).
*, ?, +  жадные. То есть они ищутся слева направо, но, найдя совпадение, не останавливаются. Результат - будет найдено самое правое совпадение.
В то же время в справке говорится, что ? отменяет жадность, если его поставить после +. Тут моя логика расплывается. http://i.smiles2k.net/msn_smiles/msn_22.gif Вопросительный знак сам по себе жадный, но если его приставить к плюсику или к звёздочке, то он нейтрализует ихнюю жадность?

Поправьте, если я где-то ошибаюсь.

36 (изменено: stealzy, 2017-10-16 21:57:58)

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

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

Кстати, идея о возможности нейтрализовать жадность ? меня заинтересовала.
Проверил работу паттерна ?? на онлайн регекс сайте — действительно работает как заявлено!
Хотя где это применимо практически — не представляю.

37

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

a = test
Regexmatch(a, "test?", match)
msgbox % match
Regexmatch(a, "test??", match)
msgbox % match

38 (изменено: ypppu, 2017-10-16 21:57:55)

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

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

39

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

ypppu, попробуйте паттерн .?? и любую строку.

40

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

Знак вопроса означает, что предыдущий элемент (символ, символ из перечня, или подшаблон) необязателен. Например, colou?r отвечает и color и colour, потому что "u" необязательно.

Соответственно наше условие удовлетворяет "test" и "tes".
Так как "?" жадный, то будет брать максимальное совпадение, то есть "test".
Поставив после него знак вопроса мы его сделали нежадным и поэтому он нам вывел первое найденное совпадение (самое короткое).

41

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

stealzy, будет выдавать число совпадений, равное (число символов *2) + 1.
Malcev, благодарю за объяснение.

42 (изменено: stealzy, 2017-10-16 22:13:34)

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

Кванторы:

+ = {1,∞} ; символ бесконечности конечно использовать нельзя, только числа =)
* = {0,∞}
? = {0,1} ; а так можно \d?? = \d{0,1}?

43

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

Прочитал в документации про Match.Mark():

Match.Mark() Возвращает ИМЯ последнего найденного (*MARK:NAME), когда это применимо.

Что это такое, есть примеры, ссылки?

44 (изменено: Malcev, 2017-10-30 01:22:32)

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

Как я понимаю, это используется для того чтобы понять по какому пути пошла проверка:

str:="abcd"
RegExMatch(str,"O)(*MARK:var1)ab|(*MARK:var2)cd",obj)
msgbox % obj.Mark

45

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

А как в шаблоне описать кавычки " ?
Представим, что есть буквальная строка blabla="79". Мне нужно извлечь цифры, находящиеся в кавычках. Вот так кавычки находятся по признаку "любой отдельный символ":

var = blabla="79"
MsgBox, % RegExReplace(var, "blabla=.(\d+).", "$1")

Но хочется понять, как искать именно кавычки. Пробовал экранировать обратным слэшем или знаком акцента - не получается.

46 (изменено: belyankin12, 2017-11-05 15:41:46)

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

Я в свое время использовал костыль. Сколько не пытался, кажется, что ввод кавычек блокирует синтаксис самого АХК, т.к. он думает, что мы используем переменную:

var = 123 "zzz" 345
z = "
RegExMatch(var, "123 " z "zzz" z " 345", end_str)
MsgBox, % end_str

Возможно существует какая-то встроенная переменная, содержащая символ " в себе, но я не уверен что-то в этом.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

47

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

Всё-таки нашёл пример на английском форуме. Вроде как существует экранирование кавычки кавычкой. Только в справке что-то не заметил.

MsgBox, % RegExReplace(var, "blabla=""(\d+)""", "$1")

48

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

На нашем форуме достаточно примеров использования кавычек, как литеральных символов. К RegEx это никакого отношения не имеет.

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

49 (изменено: ypppu, 2017-11-05 16:33:07)

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

Как RegEx понимает, что внутри внешних кавычек находится буквальная строка, а внутри внутренних - регулярное выражение? ""(\d+)""

50

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

Не совсем понял про внутренние. Такое выражение не будет работать, неверный синтаксис:

str = "123"
RegExMatch(str, ""(\d+)"", match)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

51

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

В этом сообщении я давал пример:

MsgBox, % RegExReplace(var, "blabla=""(\d+)""", "$1")

Я назвал зелёные кавычки внешними, а чёрные - внутренними.

52

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

Нет, ты неверно себе это представляешь. Кавычки интерпретирует не RegEx, а интерпретатор AHK, который внутри выражений все двойные кавычки "" считает строчными, то есть заменяет такие кавычки на " и уже в таком виде отправляет в RegEx.

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

53

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

То есть всё-таки имеет место экранирование? Но не внутриREGEX'овское, а вообще в любых выражениях?

54

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

Ну я об этом и говорю, экранирование самое обычное, как в любых других строках.

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

55

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

Всё, дошло. Вот и пример из русской справки:

;Чтобы включить буквальные кавычки в буквальную строку,
;задайте две кавычки подряд, как показано в следующем примере:
MsgBox, % "Она сказала, ""Одно яблоко в день.""" 

Спасибо!

56

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

Как сделать одним шаблоном?
Удалить все z и x, оставить только первые совпадения a, b или c.
text = zaabbxbbcaaccdd  ; abcdd
text = bbbbaaddaa  ; badd

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

57 (изменено: teadrinker, 2017-11-08 21:53:46)

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

Вряд ли получится. Я знаю только такой способ:

text := "zaabbxbbcaaccdd"  ; abcdd

MsgBox, % RegExReplace(text, "([abc])\K\1+|[zx]")

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

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

58 (изменено: belyankin12, 2017-11-08 22:25:06)

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

Все ненужные символы можно удалить через stringreplace. А вот повторяющиеся уже не скажу. Разве что высчитать с помощью match количество совпадений и удалить в цикле через stringreplace ненужные буквы.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

59

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

belyankin12 пишет:

Все ненужные символы можно удалить через stringreplace.

Нет, невнимательно прочитали:

teadrinker пишет:

как удалить определённые символы (идущие необязательно подряд), находящиеся на любом расстоянии справа после указанного символа.

StringReplace с такой задачей никак не справится.

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

60 (изменено: belyankin12, 2017-11-08 22:41:27)

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

Как до дела дошло то даже по другому сделал все.

text := "zaabbxbbcaaccdd"  ; abcdd

StringReplace, text, text, z, , all
StringReplace, text, text, x, , all
StringReplace, text, text, a, 1
StringReplace, text, text, b, 2
StringReplace, text, text, c, 3
StringReplace, text, text, a,, UseErrorLevel
StringReplace, text, text, b,, UseErrorLevel
StringReplace, text, text, c,, UseErrorLevel
StringReplace, text, text, 1, a
StringReplace, text, text, 2, b
StringReplace, text, text, 3, c

msgbox, % text

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

UPD: насчёт 59 поста, т.е. после определенного символа нужно все отрезать? RegExReplace или даже можно Match прикрутить. Или после n-го символа все отрезать?

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

61

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

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

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

62

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

А, тю, я проявил невнимательность, прошу простить.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

63

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

belyankin12 пишет:

UPD: насчёт 59 поста, т.е. после определенного символа нужно все отрезать? RegExReplace или даже можно Match прикрутить. Или после n-го символа все отрезать?

str := "cccbbdddaeeebbfffbbgbbbb" ; —> cccbbdddaeeefffg

Нужно удалить все b, идущие после a за один проход.

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

64

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

Зачем делать что-то одним шаблоном? Код станет проще? Код станет понятнее? Эффективнее?

teadrinker пишет:

как удалить определённые символы (идущие необязательно подряд), находящиеся на любом расстоянии справа после указанного символа.

text := "zaabb,xbbcazaczcxdd"
указанныйСимвол := ","
определённыеСимволы := "[zx]"
MsgBox % f(text, указанныйСимвол, определённыеСимволы)

f(text, symbol, removeSymbols) {
	RegExMatch(text, "(?<=,).*(?=\R|$)", text2)
	Return RegExReplace(text, text2, RegExReplace(text2, "[zx]"))
}

65

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

teadrinker пишет:

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

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

66

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

stealzy пишет:

Зачем делать что-то одним шаблоном? Код станет проще? Код станет понятнее? Эффективнее?

Затем, что задача такая. На развитие понимания RegEx.
На самом деле опять не совсем верно определил задачу, это просто решается.

text := "zaabb,xbbcazaczcxdd"

MsgBox, % RegExReplace(text, "[zx](?!.*,)")

Задача в том, чтобы если здесь запятой не будет, шаблон ничего не делал.

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

67

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

text := "zaabb,xbbcazaczcxdd"
MsgBox, % RegExReplace(text, "\G(\A[^,]*(z|x))?+[^zx]*\K(z|x)")

68

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

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

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

69

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

Хз, чем такой однострочник лучше. Мой код гораздо понятнее и легче менять. И тоже ничего не делает, если нет запятой .

70

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

stealzy пишет:

Мой код гораздо понятнее и легче менять

А через Loop, parse ещё понятнее и легче менять.

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

71

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

Только хотел сказать, что я тоже могу придумать код без этого RegEx.

72

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

teadrinker пишет:

А через Loop, parse ещё понятнее и легче менять.

Только для незнакомого с RegEx человека, потому что шаблон очень прост и гораздо гибче, чем кодирование без использования RegEx.
А вот когда вы глянете через год на шаблон типа "\G(\A[^,]*(z|x))?+[^zx]*\K(z|x)", может потребоваться больше времени на его осмысление, чем на написание нового кода типа моего.

73 (изменено: svoboden, 2017-11-09 03:06:43)

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

Я считаю, что далеко не все делается через RegEx, т.к. RegEx не способствует пониманию самого ahk, чем, например, более простые команды. Хоть и понимаю RegEx.

74

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

teadrinker пишет:
stealzy пишет:

Зачем делать что-то одним шаблоном? Код станет проще? Код станет понятнее? Эффективнее?

Затем, что задача такая. На развитие понимания RegEx.

Вот это воды натекло, на ровном месте.

svoboden пишет:

RegEx не способствует пониманию самого ahk

Тут как бы и тема именно про понимание RegEx.

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

75

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

Malcev пишет:
text := "zaabb,xbbcazaczcxdd"
MsgBox, % RegExReplace(text, "\G(\A[^,]*(z|x))?+[^zx]*\K(z|x)")

Можно упростить, вроде:

text := "zaabb,xbbcazaczcxdd"
MsgBox, % RegExReplace(text, "\G(\A[^,]*)?+[^zx]*\K[zx]")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

76

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

И ещё проще:

text := "zaabb,xbbcazaczcxdd"
MsgBox, % RegExReplace(text, "\G(\A[^,]*)?+.*?\K[zx]")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

77 (изменено: teadrinker, 2017-11-10 02:07:58)

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

\A это то же самое, что ^

text := "zaabb,xbbcazaczcxdd"
MsgBox, % RegExReplace(text, "\G(^[^,]*)?+.*?\K[zx]")

точнее, отличается только в многострочном режиме.

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

78

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

Вопрос по RegExMatch.
"a" должна быть только с одной стороны от "|".
b|b  ; false
a|a  ; false
a|b  ; true
b|a  ; true

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

79

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

По прошлому вопросу придумал только как не удалять первый символ, как бы его под несколько символов переделать, не только для "а".

text = zaabbxbbcaaaaaccdd  ; abcdd
MsgBox, % RegExReplace(text, "((?<=a)([^a]*)a)", "$2")
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

80

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

serzh82saratov пишет:

"a" должна быть только с одной стороны от "|".

Это вроде просто:

str1 := "b|b"
str2 := "a|a"
str3 := "a|b"
str4 := "b|a"

Loop 4
   MsgBox, % RegExMatch(str%A_Index%, "a\|[^a]|[^a]\|a")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

81

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


MsgBox % (RegExMatch(str%A_Index%, "a\|") ? true : false)
       ^ (RegExMatch(str%A_Index%, "\|a") ? true : false)

82 (изменено: Mambr, 2017-12-05 13:45:26)

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

Добрый день!
Требуется помощь глобального разума!

Суть вопроса:
Не получается составить ОЧЕНЬ сложный шаблон для удаления строк (пунктов меню) в grub.cfg - файл конфига Grub2
Пример части кода из него:


menuentry "Загрузка установленной Windows" --class windows {
	set root=(hd1,1)
	chainloader +1
}

submenu "Kali Linux x86 (параметры загрузки) >>>" --class ninja {
	
	menuentry "<<< Back (или нажать [Esc])" {
		configfile (hd0,1)/boot/grub/grub.cfg
	}
	
	menuentry "Kali Linux - live mode" --class ninja {
		linux /Kali/live/vmlinuz-4.12.0-kali1-686-pae live-media-path=/Kali/live locales=ru_RU.UTF-8 keyboard-layouts=ru,us keyboard-options=grp:ctrl_shift_toggle pkeys=ru setxkbmap=ru boot=live components splash username=root hostname=kali
		initrd /Kali/live/initrd.img-4.12.0-kali1-686-pae
	}
	
	menuentry "Kali Linux - encrypted persistence mode" --class ninja {
		linux /Kali/live/vmlinuz-4.12.0-kali1-686-pae live-media-path=/Kali/live locales=ru_RU.UTF-8 keyboard-layouts=ru,us keyboard-options=grp:ctrl_shift_toggle pkeys=ru setxkbmap=ru persistence-label=Kali boot=live components splash username=root hostname=kali persistent=cryptsetup persistence-encryption=luks persistence
		initrd /Kali/live/initrd.img-4.12.0-kali1-686-pae
	}
}

submenu "Установка Windows 10 Enterprise >>>" --class windows {
	
	menuentry "<<< Back (или нажать [Esc])" {
		configfile (hd0,1)/boot/grub/grub.cfg
	}
	
	menuentry "Установка Windows 10 Enterprise x64" --class windows {
		chainloader /efi/boot-winSet/x64/bootx64.efi
	}
	
	menuentry "Установка Windows 10 Enterprise x86" --class windows {
		chainloader /efi/boot-winSet/x86/bootia32.efi
	}
}

Нужно загнать в переменную какой-нибудь маркер, напр., слово "Загрузка", ""Установка" и т.п. и удалить все строки по этому маркеру.
При этом нужно удалить все строки вместе с последней закрывающей } + одна пустая строка после нее.
Например все это:


menuentry "Загрузка установленной Windows" --class windows {
	set root=(hd1,1)
	chainloader +1
}

Есть еще одна крутая заморочка - пункты submenu и menuentry
Думаю, это наглядно видно из представленного образца конфига Grub2.
Если submenu, нужно также удалить все вместе с закрывающей } + одна пустая строка после нее, а menuentry в submenu может быть сколько угодно ...

Как вам мозголомочка? Возможно сваять ТАКОЙ шаблон или это из категории unreal???

83

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

ButtonAuto:
link := "https://bitconnect.co/user/trade?Market=BCC"
req := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
req.Open("GET", link, false)
req.Send()
text := req.responseText

RegexMatch(text, "(<span class=""text-white small-size-font ""><i class=""fa fa-dollar  ""></i> (.+?)</span>)(<span class=""dev_base_currency_last_price_dollar_header"" style=""font-size: 11px"">(.+?)</span>)", match)
MsgBox, % match1 match2
Return

Подскажите, как задать шаблон границы начала и конца? По справке не понятно, методом тыка тоже не доходит как сделать. По отдельности работает:


RegexMatch(text, "<span class=""text-white small-size-font ""><i class=""fa fa-dollar  ""></i> (.+?)</span>", match)
RegexMatch(text, "<span class=""dev_base_currency_last_price_dollar_header"" style=""font-size: 11px"">(.+?)</span>", m)
MsgBox, % match1 m1

84

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

Странникх пишет:

Подскажите, как задать шаблон границы начала и конца?

Начала и конца чего?

Странникх пишет:
RegexMatch(text, "(<span class=""text-white small-size-font ""><i class=""fa fa-dollar  ""></i> (.+?)</span>)(<span class=""dev_base_currency_last_price_dollar_header"" style=""font-size: 11px"">(.+?)</span>)", match)
MsgBox, % match1 match2

Это не может работать в принципе. Чему здесь соответствует match1? Содержание параметра NeedleRegEx должно точно соответствовать части или целому тексту, в том виде, как он есть в исходной переменной, а у вас тут две несвязанных между собой части из разных мест. Естественно, что соответствие не найдено, такого текста в переменной нет.

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

85 (изменено: teadrinker, 2017-12-09 23:17:19)

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

Пример:

text =
(
Первая строка
Вторая строка<1234.56>
Третья строка
Четвёртая строка<789.0>
Пятая строка
)

RegExMatch(text, "s)Вторая строка<([0-9\.]+).*?Четвёртая строка<((?1))", Number)
MsgBox, % Number1 . A_Tab . Number2
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

86

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

teadrinker, спасибо так работает)

RegExMatch(text, "s)<span class=""text-white small-size-font ""><i class=""fa fa-dollar  ""></i> ([0-9\.]+).*?<span class=""dev_base_currency_last_price_dollar_header"" style=""font-size: 11px"">((?1))", match)

87

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

DEF - нужные символы, abc - ненужные.
Надо в M1 получить "DFE", или пусто, если нет нужных, в M2 получить  "***".

Str = aDcFbEba***

RegExMatch(Str, "", M)

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

88

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

serzh82saratov пишет:

Надо в M1 получить "DFE", или пусто, если нет нужных, в M2 получить  "***".

Не совсем понятно: или пусто, если нет нужных <> если нет нужных, в M2 получить "***"

89

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

М1 пусто если нет нужных. В M2 всегда то, что после нужных и ненужных. Если нужных и ненужных нет, то в M2 вся строка.

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

90

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

В одну строчку не получится. RegexMatch определяет только символы, идущие подряд, RegexReplace не выдаст две переменные.

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

91

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

Это самый лучший ответ. А я голову ломаю.

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

92

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

По теме RegExMatch
Есть некая строка из всяких слов, в которой должно быть число, строка может меняться, вот примеры:
"Слово слово 222 слово"
"222 слово слово слово"
"Слово 222"
"Слово слово слово слово 222"
Исходя из этих строк, нужен шаблон, который в любых случаях мог найти "222" из той или иной строки, не поможете? Как только не пытался составить шаблон, не получается

93

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

Как только не пытался составить шаблон, не получается

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

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

94

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

Просто используйте  IfInString.

, нужен шаблон, который в любых случаях мог найти "222"

95 (изменено: MandarinKa02, 2018-09-11 21:05:26)

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

Как в регулярном выражении создать условие: или пробел или конец строки(или ничего)?

RegExMatch(options,"name(.*([\s]|))",name)

Регулярка должна совпадать со следующими строками:

nameИскомое
nameИскомое что-то другое

96

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

str1 := "nameИскомое"
str2 := "nameИскомое что-то другое"
RegExMatch(str2, "name\K\S+", name)
MsgBox, % name
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

97 (изменено: MandarinKa02, 2018-09-11 22:21:47)

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

teadrinker, благодарю.

98

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

Подскажите пожалуйста, как выполнить запись, чтобы "items" всегда содержал все четыре элемента списка?


list =
(Join`r`n
# Список

On
    BaseType "тип"
    SetBorderColor 74 0 160
    SetFontSize 30
	
On
    BaseType "тип1" "Тип2" "тип3" "Тип4" "тип-другое"
    SetTextColor 255 200 0
    SetBackgroundColor 127 127 127

Off
    Count >= 30
    BaseType "Type"
    SetTextColor 197 255 23
    SetBackgroundColor 255 255 255 0
    SetBorderColor 255 255 255 0
    SetFontSize 25

On
	Class "Item Class" "Класс предмета"
    SetTextColor 197 255 23
	SetBackgroundColor 0 0 0 0
    SetBorderColor 197 255 23
    SetFontSize 25
)
pos := 1, match := "", items := []
While pos := RegexMatch(list, ".*((On|Off)\R([[:blank:]\wА-Яа-я""\-\>\<\=]+\R)+)", match, pos + Strlen(match))
	items.Push( match1 )

MsgBox,,Title,% items.Length()
Loop,% items.Length()
	MsgBox,,Title,% items[ A_Index ]

Такая запись работает только если между элементами списка есть пустая строка.

99

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

Реши, заменой плюса на диапазон, начинающийся от четырёх символов, так как учитывая длину "On|Off" - максимальным будет три.

While pos := RegexMatch(list, ".*((On|Off)\R([[:blank:]\wА-Яа-я""\-\>\<\=]{4,}\R)+)", match, pos + Strlen(match))
	items.Push( match1 )

Но если есть более элегантная запись, буду признателен за науку.

100

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

В вашем шаблоне не учтены буквы ёЁ.
Можно так:

While pos := RegexMatch(list, "s)\R+\K(On|Off)\R+.+?(?=(\R+(On|Off)\R|\R*$))", match, pos + Strlen(match))
	items.Push( match )