1 (изменено: BSN201904, 2019-06-16 19:59:41)

Тема: AHK: v1.1.30.03 RegExMatch работает с ошибкой(решено. ошибки нет)

Есть код:


#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
F:="asssdfkrlssllssss"
MsgBox F=%F%
if (RegExMatch(F, "O)(s+).+(s*+).+(s*+)", my_object)>0) {
	MsgBox % " | "my_object[0]" | "my_object[1]" | "my_object[2]" | "my_object[3]
}

F="" ; Очистить память
ExitApp

Я ожидал, что результатом будет:
" | sssdfkrlssllssss | sss | ss | ssss"

А он выдаёт:
" | sssdfkrlssllssss | sss |  | "

Это я где-то ошибся, или функция RegExMatch выполняется с ошибкой?

2

Re: AHK: v1.1.30.03 RegExMatch работает с ошибкой(решено. ошибки нет)

Т.е. должно быть найдено 4 не пустые подстроки, а у меня две последние почему-то пустые.
Хотя режим вроде GREEDY ("жадный")

3

Re: AHK: v1.1.30.03 RegExMatch работает с ошибкой(решено. ошибки нет)

Плохо разобрались в принципе действия квантификаторов. Какой смысл вы вкладываете в конструкцию s*+ ? Чем это отличается от s* ? А чем от s+ ?

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

4 (изменено: BSN201904, 2019-06-15 22:40:01)

Re: AHK: v1.1.30.03 RegExMatch работает с ошибкой(решено. ошибки нет)

teadrinker
Это просто описка.
Вот исправленный код

+ открыть спойлер
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
F:="asssdfkrlssllssss"
MsgBox F=%F%
if (RegExMatch(F, "O)(s+).+(s+).+(s+)", my_object)>0) {
	MsgBox % " | "my_object[0]" | "my_object[1]" | "my_object[2]" | "my_object[3]
}

F="" ; Очистить память
ExitApp

Но он всё равно выдает не

" | sssdfkrlssllssss | sss | ss | ssss"

А

" | sssdfkrlssllssss | sss | s | s"

Т.е. для 3-й и 4-й подстроки почему-то отключается "жадный" режим и захватываются только первые символы подстрок

5 (изменено: KusochekDobra, 2019-06-16 02:59:27)

Re: AHK: v1.1.30.03 RegExMatch работает с ошибкой(решено. ошибки нет)

BSN201904 пишет:

Т.е. для 3-й и 4-й подстроки почему-то отключается "жадный" режим и захватываются только первые символы подстрок

Не "первые" символы подстрок. Весь Ваш шаблон захватывает, буквально первые три символа "s" затем пропускает "dfkrlsslls", захватывает один символ "s" идущий после них, следующий пропускает и захватывает последний "s". Так:
asssdfkrlssllssss

Почитайте про знак вопроса.

6 (изменено: BSN201904, 2019-06-16 08:40:03)

Re: AHK: v1.1.30.03 RegExMatch работает с ошибкой(решено. ошибки нет)

KusochekDobra
Может я что-то не понял в том, как работает функция RegExMatch с модификатором O) - тогда прошу пояснить.
Судя по хэлпу и поиску в гугле я понял, что она работает следующим образом:
1)Подстрока, соответсующая всему шаблону, записывается в объект номер 0
2)Подстрока, соответствующая подшаблону, начинающемуся с 1-й открывающейся скобки, записывается в объект номер 1
3)Подстрока, соответствующая подшаблону, начинающемуся с 2-й открывающейся скобки, записывается в объект номер 2
...
и т.д.
И понятно почему это сделано именно так. Эти объекты - это как бы аналоги содержимого "обратных ссылок" ($0, $1, $2 и т.д.), с которыми манипулирует строка замены на языке REGEX.

Но почему-то пример в моём коде показал, что это работает не так.

Я не правильно понял, как работает функция RegExMatch с модификатором O) ?
Или у меня алгоритм не "жадный"?

7 (изменено: teadrinker, 2019-06-16 18:05:57)

Re: AHK: v1.1.30.03 RegExMatch работает с ошибкой(решено. ошибки нет)

BSN201904 пишет:

Я не правильно понял, как работает функция RegExMatch с модификатором O) ?

Работа RegEx с опцией O ничем не отличается, только обозначения другие.

BSN201904 пишет:

Т.е. для 3-й и 4-й подстроки почему-то отключается "жадный" режим

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

RegExMatch("asssdfkrlssllssss", "(s+).+(s+).+(s+)")

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

Второе выражение .+ в режиме жадности захватывает максимальное количество любых следующих символов так, чтобы выражения, расположенные правее, оставались валидными. Выражение за ним — s+ — означает один и более символов s. Соответственно, ему достаточно одного s, чтобы оставаться валидным. Поэтому предыдущее .+ захватывает всё, кроме последнего s, которое и остаётся следующему выражению. Думаю, принцип понятен.

Можете рассмотреть вместо .+ использование [^s]+ (один и более символов, которые не s), либо отключение жадности для .+ с помощью знака вопроса.

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

8 (изменено: BSN201904, 2019-06-16 20:03:47)

Re: AHK: v1.1.30.03 RegExMatch работает с ошибкой(решено. ошибки нет)

teadrinker пишет:

Второе выражение .+ в режиме жадности захватывает максимальное количество любых следующих символов

teadrinker
Бинго! Именно так.
Спасибо огромное. Именно в этом месте я и лоханулся.

teadrinker пишет:

Можете рассмотреть вместо .+ использование [^s]+ (один и более символов, которые не s), либо отключение жадности для .+ с помощью знака вопроса.

Именно так.

Блин. Не первый год пользуюсь регексами в Notepad++ и PowerGrep и так лохануться.
Как будто пелена на глаза упала.
Ещё раз спасибо.

Ваш ответ лучший.

------------------
Я тему переименовал, чтобы её название не смущало