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
Skype dmitry_fiveg

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
Skype dmitry_fiveg

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
Skype dmitry_fiveg