201 (изменено: kamelotto, 2020-01-18 16:08:59)

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

Malcev А если в самом выражении указать "О)выражение", можно будет потом обращаться к частям объекта?

MsgBox, % Match.Value(1)
MsgBox, % Match[1] 
MsgBox, % Match.Pos(1)
MsgBox, % Match.Len(1)

Или у нас просто нет Match, в случае записи Val := V ~= "О)выражение" ?

202

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

Вы можете сами это проверить.

203

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

Сложно для понимания. В (RegEx) - краткий справочник, в объяснении третьего смысла использования круглых скобок "(...)".
Выделить некоторый подшаблон, например точка-звездочка: abc(.*)xyz. Например, функция RegExMatch() в своем выходном массиве может сохранить соответствия всех выделенных подшаблонов, функция RegExReplace() разрешает, чтобы подстроки, соответствующие каждому из подшаблонов, были сохранены в результате путем использования обратных ссылок в духе $1. Чтобы использовать скобки, не вызывая сохранения группы, сразу после открывающей скобки поставьте ?:; например: (?:.*).
Я, что то не могу понять, о чём идёт речь
Есть ли объяснения с примерами кода?

204

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

Пример:

str := "abcdefg"
RegExMatch(str, "(a..).*?(e..)", m)
MsgBox, % m1
RegExMatch(str, "(?:a..).*?(e..)", m)
MsgBox, % m1

Во втором случае используется ?:, поэтому первый подшаблон в исходящей переменной не сохраняется.

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

205

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

Думал, что сам справлюсь, потому что задача казалась простой и похожей на предыдущую. Но не получается.
Задача: Выловить текст, до первого тега, но если строка начинается с тега, совпадения быть не должно. Если делать так:

String = Нужный текст<Лишнее_1>...Лишнее... <Лишнее_2/> ...Лишнее2...<Лишнее_3/><Лишнее_4> 	<Лишнее_5/>
RegExMatch(String, ".+?(?=<)", match)
MsgBox, % "Подстрока: " . match

МсБокс выводит "Нужный текст". Вроде всё правильно. Но если строка начинается с <тега>, с шаблоном совпадает и
"Лишнее".

String = <Лишнее_1>...Лишнее... <Лишнее_2/> ...Лишнее2...<Лишнее_3/><Лишнее_4> 	<Лишнее_5/>
RegExMatch(String, ".+?(?=<)", match)
MsgBox, % "Подстрока: " . match

Вывод МсБокса: "<Лишнее_1>...Лишнее... "Пробовал ограничить этим [^<>]. Однако не работает. Шаблон продолжает совпадать с указаными знаками

206 (изменено: teadrinker, 2020-01-20 18:10:19)

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

Используйте .* вместо .+

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

207 (изменено: kamelotto, 2020-01-20 18:19:10)

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

teadrinker пишет:

Во втором случае используется ?:, поэтому первый подшаблон в исходящей переменной не сохраняется.

Иными словами: RegExMatch рассматривает и находит оба подшаблона. Но ?: запрещает ему возвращать помеченный подшаблон? И поэтому RegExMatch возвращает только второй?

208

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

Когда Вы пользуетесь командой RegExReplace, там есть параметр Replacement (это строка, которой будет замещена найденная структура при каждом совпадении).  В состав Replacement'а может входить часть исходной строки: $1 - ссылка не первый подшаблон, $2 - на второй подшаблон, и так далее. А подшаблоны внутри NeedleRegEx выделяются  скобками. И, если мы хотим выделить подшаблон, но не хотим, чтобы он попал в перечень подшаблонов (не пронумеровался в процессе работы команды RegExReplace), то в начале подшаблона сразу после открывающейся скобки нужно добавить ?:

209

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

kamelotto пишет:

?: запрещает ему возвращать помеченный подшаблон? И поэтому RegExMatch возвращает только второй?

Вроде того.

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

210

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

ypppu пишет:

$1 - ссылка не первый подшаблон, $2 - на второй подшаблон

Вроде понятно. А как это выглядит в коде? $1, $2
val := match.$2
Или как то ещё?

211 (изменено: kamelotto, 2020-01-20 20:04:35)

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

teadrinker пишет:

Используйте .* вместо .+

Кажется я только теперь понял разницу между .+ и .* Шаблон с .+ не допускает отсутствия символов. И поэтому он включал в себя строку до первого <. Спасибо.
Ещё вопрос:
Можно ли два условия сложить в одном регулярном выражении? Если нет совпадения по первому подшаблону, поиск должен вестись по второму.
И вообще, на русском, про подшаблоны, очень мало что нашёл. Что с ними можно делать?

212

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

kamelotto пишет:

Можно ли два условия сложить в одном регулярном выражении?

Можно использовать знак "или" |.

MsgBox, % RegExMatch("ab", "c|b")
RegExMatch("ab", "a(c|b)", m)
MsgBox, % m1
kamelotto пишет:

Что с ними можно делать?

Можно группировать символы, как в последнем примере, чтобы показать, что знак | относится только к c и b.

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

213

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

kamelotto пишет:

А как это выглядит в коде? $1, $2
val := match.$2
Или как то ещё?

В конце перевода команды RegExReplace() имеется пример

NewStr := RegExReplace("abcXYZ123", "abc(.*)123", "aaa$1zzz")  ; Возвращает "aaaXYZzzz" за счёт обратной ссылки $1.

Кажется я только теперь понял разницу между .+ и .* Шаблон с .+ не допускает отсутствия символов.

Справка пишет:

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

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

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

214

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

ypppu пишет:

Точка соответствует любому отдельному символу (исключая символы новой строки: `r и `n)

Это ошибка.

By default, a dot matches any single character which is not part of a newline (`r`n) sequence, but this can be changed by using the DotAll (s), linefeed (`n), carriage return (`r), `a or (*ANYCRLF) options.

Точный перевод:

По умолчанию точка соответствует любому отдельному символу, который не является частью последовательности (`r`n), но это может быть изменено опциями DotAll (s), linefeed (`n), carriage return (`r), `a или (*ANYCRLF).

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

215

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

Да, эту неточность уже обсуждали здесь.

216 (изменено: Malcev, 2020-01-20 23:00:00)

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

В английской версии, кстати, тоже ошибка, так как:

msgbox % RegexMatch("`r`n", ".\n")
msgbox % RegexMatch("`r`n", "\r.")

217 (изменено: teadrinker, 2020-01-20 23:26:16)

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

Да, в pcre:

       When a line ending is defined as a single character, dot never  matches
       that  character; when the two-character sequence CRLF is used, dot does
       not match CR if it is immediately followed  by  LF,  but  otherwise  it
       matches  all characters (including isolated CRs and LFs). When any Uni-
       code line endings are being recognized, dot does not match CR or LF  or
       any of the other line ending characters.

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

218 (изменено: kamelotto, 2020-01-21 00:43:45)

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

ypppu пишет:

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

Я про это и говорю.
При использовании .* в шаблоне ".*?(?=<)", функция не продолжает поиск, после < (<первый символ). Потому что .* позволяет принять пустую последовательность, как результат, и не продолжать поиск.
А при использовании .+ в шаблоне ".+?(?=<)", функция продолжит искать, даже если строка начинается с <, потому что .+ не примет пустую последовательность за результат. Последовательность до символа <, не может быть пустой.
Я правильно понял поведение в этом конкретном случае?

219

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

Запостил этот баг на оффоруме.

220 (изменено: kamelotto, 2020-01-21 15:33:14)

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

Malcev Вечно я нахожу, то баги, то недокументированные возможности. Со мной везде так происходит. Карма такой.
Интересно. Если это баг, то когда его исправят?
Попробовал ещё пару вариантов. Не знаю считать ошибкой такое поведение или нет? Использую .+ и .* в сочетании с последовательностью [^<>]
Строка_1 = Текст_1<teg_1>Текст_2<teg_2> Выражение: ".+?[^<>]+"
С .+ и с .* результат одинаковый МсБокс выводит: Текст_1
Но если Строка_2 = <teg_1>Текст_2<teg_2> С тем же выражением, МсБокс выводит: <teg_1. То есть, запрещённый символ проглатывается, если он стоит первым.

221

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

kamelotto пишет:

Интересно. Если это баг, то когда его исправят?

Ну это не баг кода, а недочет в документации, который в принципе ни на что не влияет.
Документацию, наверное, поправят в ближайшем апдейте.

222 (изменено: kamelotto, 2020-01-21 15:33:53)

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

Malcev
Тогда какие могут быть варианты решения, кроме тех, что я попробовал?
Я пробовал: ".+?[^<>]+" , ".*?[^<>]+" , ".+?>\K[^<>]+" , "^\s+$"  и "\s+$"
Строка_1 = Текст_до_тега<teg_1>Текст_2<teg_2> <teg_3>Текст_3 <teg_4>Текст_4  , или
Строка_2 = <teg_1>Текст_2<teg_2> <teg_3>Текст_3 <teg_4>Текст_4 .
Получается выловить тексты из тегов. Но для каждого варианта своё выражение:
"Текст_до_тега" вылавливают эти выражения: ".*?[^<>]+" , ".+?[^<>]+" , ".*?(?=<)" , ".+?(?=<)".
Текст_2, Текст_3 и пробел, меду тегами 2 и 3 вылавливает это выражение: ".+?>\K[^<>]+". Но надо, что бы шаблон не воспринимал пробел, между тегами 2 и 3, как совпадение, а проходил мимо.
Пробел (могут быть разные пробельные символы и в разном количестве) отслеживается этим выражением: "^\s+$", а пробел в конце строки вот этим: "\s+$"
Я запускаю цикл, для получения в переменную каждого варианта подстроки "Текст(ы)", и отлавливаю все тексты. Задачу я решил. Но код цикла разросся, из за многочисленных if и else if, для разных вариантов подстроки.
Я хотел сделать одно универсальное выражение, способное отличить разные варианты. Попробовал сложить эти выражения в одно, через | (ИЛИ). Но ничего не работает.
Возможно ли сделать универсальную регулярку, для этих двух вариантов строки и отлавливать все варианты "Текст(ов)"?

223 (изменено: Malcev, 2020-01-21 15:26:34)

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

Про баг в документации, я имел в виду пост номер 216.
В ваш код не углублялся, но когда мне надо было получать текст между тегами, то я его получал с помощью RegexMatch в цикле.

224

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

Malcev Тогда посмотрите пожалуйста пост 220. Там не однозначно, а в чём дело, понять не могу.

Malcev пишет:

но когда мне надо было получать текст между тегами, то я его получал RegexMatch в цикле.

Я так и делаю. Расписал в 222 посте.

225

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

Я тоже, так как не понимаю, что вы хотите получить.
Лично я не люблю сложных регулярных выражений, так как, чем сложнее регулярка, тем потом вам сложнее будет ее изменить.

226

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

Исходную строку приведите и ваш код.

227

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

Malcev
В 220 посте они есть. В 222 посте они тоже есть.

228

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

Лично мне ничего не понятно из этих постов.
Может кто другой разберется.

229

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

Malcev пишет:

так как, чем сложнее регулярка, тем потом вам сложнее будет ее изменить.

То есть, лучше использовать несколько if - else if, с простыми выражениями, в одном цикле, чем пытаться сократить код, за счёт усложнения самого выражения?

230 (изменено: Malcev, 2020-01-21 16:02:09)

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

Для кого как. Если каждый день писать регулярки, то наверное можно и усложнить.
Я довольно много парсил хтмл страницы и всегда пользовался таким алгоритмом:

text := "<tag><b>text1</b>...<b>text2</b></tag>..........<tag><b>text3</b>...<b>text4</b></tag>..........<tag><b> </b>...<b>text6</b></tag>"
match := "", Pos := 1
While Pos := RegExMatch(text, "s)<tag>(.+?)</tag>", match, Pos+StrLen(match))
{
   matchh := "", Poss := 1
   While Poss := RegExMatch(match1, "s)<b>(.+?)</b>", matchh, Poss+StrLen(matchh))
   {
      if !RegExMatch(matchh1, "^\s+$")
         msgbox % matchh1
   }
}

231

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

Ещё будет полезным знать, что RegEx не обрабатывает строку свыше 10 мегабайт.
http://forum.script-coding.com/viewtopi … 85#p125585

232 (изменено: kamelotto, 2020-01-22 03:34:39)

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

Malcev А зачем вам понадобилась опция s) ?
и
match1, что бы взять первый элемент встроенного массива match?
И
Pos+StrLen(match). Не ожидал таких вольностей в коде. Прикольная возможность.
Понравилась компактность. Но у меня немного сложнее, и строки, и задачи. Мне мало получения подстрок. Я их изменяю. Но не все надо изменять. Тут хоть искусственный интеллект подключай.
Да и подстроки у меня не только между тегами. Есть ещё подстроки до тегов и подстроки после тегов, которыми строка заканчивается. У меня разные строки. Не однотипные. А цикл я использую простой Loop, в комбинациях с If.

233

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

kamelotto пишет:

зачем вам понадобилась опция s) ?

Чтобы точка соответствовала любому символу.
В принципе код из 230 и есть обычный loop - мы находим нужное нам совпадение, после чего начинаем искать новое совпадение уже с новой позиции.

234

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

Malcev
Ну в общем алгоритм у меня такой же, только сложнее реализация. Но в одном месте можно неплохо сократить.

if (условие) 
	{
		String := RegExReplace(String, ".+?>\K[^<>]+", Repli, Q, 1, SP)
		MsgBox, % "Строка с заменой: " . String
		MsgBox, % "Количество произведённых замен: " . Q
		RegExMatch(String, "O).+?>\K[^<>]+", match, SP)
		MsgBox, % "Изменённый сегмент строки: " . match.Value
		Len := match.Len 
		MsgBox, % "Длина изменённого (совпавшего) сегмента: " . Len
		SP :=SP+Len
		MsgBox, % "Стартовая позиция следующего цикла: " . SP
	}

Вот эта Ваша строка неплохо реализует мой блок: While Pos := RegExMatch(text, "Выражение", match, Pos+StrLen(match))
Понравилось

235

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

Как выяснить, есть ли в конце строки пробельный символ?
А если есть, то какой именно? Его же не видно.
Писать самому условия совпадения на каждый символ, или есть какое то готовое решение в самом АНК?

236

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

Готового нет, но, учитывая, что их всего несколько штук, перечислить все варианты не составит труда. Регулярка здесь не нужна, достаточно определить код последнего в строке символа.

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

237 (изменено: kamelotto, 2020-01-27 14:21:10)

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

teadrinker
Одного символа, или двух? Такой вариант бывает?: `n`r
Я вообще четыре клавиши нажал. Может это уже 4 символа?

238

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

Ну вы-то вначале про один символ спрашивали.

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

239

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

kamelotto пишет:

Одного символа, или двух? Такой вариант бывает?: `n`r
Я вообще четыре клавиши нажал. Может это уже 4 символа?

Кто вам мешает всё это проверить самому?

240 (изменено: kamelotto, 2020-01-28 17:32:32)

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

У меня не работает выбор подшаблонов. Чувствую, что что то не так, но что, понять не могу.

;Строка может быть такой
text := "Текст до первого тега<teg_2>Текст_2 <teg_1> <teg_2>" 
; Или такой
text := "<teg_2>Текст_2 <teg_1> <teg_2>"
RegExMatch(text, "s).*?(?=<)", match)
RegExMatch(text, "s).+?>\K[^<>]+", match)

По отдельности оба выражения работают корректно. Каждое отлавливает свою часть.
Но когда я пытаюсь использовать |(Или), match = NULL . Выражение: "s).*?(?=<)|.+?>\K[^<>]+"
То есть выбор варианта, по которому искать совпадение, не срабатывает со вторым вариантом строки.
Мне надо понять, как заставить выражение реагировать на разные варианты строки. Что бы в случае отсутствия текста до первого тега, оно выбрало второй вариант поиска, и уже искало бы текст между тегами.

241

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

kamelotto пишет:

match = NULL

Что за NULL? Покажите код, который такое возвращает.

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

242 (изменено: kamelotto, 2020-01-29 02:54:49)

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

teadrinker

text := "Текст до первого тега<teg_1>Текст между тегами <teg_2> <teg_3>"
RegExMatch(text, "s).*?(?=<)", match)
	if (match != NULL)
	MsgBox, % match
	else if (match = NULL)
	MsgBox, % "Переменная пуста"
text := "Текст до первого тега<teg_1>Текст между тегами <teg_2> <teg_3>"
RegExMatch(text, "s).+?>\K[^<>]+", match)
	if (match != NULL)
	MsgBox, % match
	else if (match = NULL)
	MsgBox, % "Переменная пуста"
text := "Текст до первого тега<teg_1>Текст между тегами <teg_2> <teg_3>"
RegExMatch(text, "s).*?(?=<)|.+?>\K[^<>]+", match)
	if (match != NULL)
	MsgBox, % match
	else if (match = NULL)
	MsgBox, % "Переменная пуста"
text := "<teg_1>Текст между тегами <teg_2> <teg_3>"
RegExMatch(text, "s).*?(?=<)|.+?>\K[^<>]+", match)
	if (match != NULL)
	MsgBox, % match
	else if (match = NULL)
	MsgBox, % "Переменная пуста"	

В последнем выводе:  "Переменная пуста". Это означает, что match = NULL. Часть выражения после |(ИЛИ) не срабатывает.
"s).*?(?=<)|.+?>\K[^<>]+"Хотя в самостоятельном виде работает корректно.

243 (изменено: teadrinker, 2020-01-29 03:18:05)

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

В AHK нет такого понятия, как NULL, в данном случае NULL воспринимается, как пустая переменная.
Я так понимаю, что проблему вы видите с последним примером. Но если match пуста, это ещё не значит, что соответствие не найдено, пустое соответствие — тоже соответствие, если оно соответствует шаблону. Первая часть у вас .*?(?=<) — любое (а значит и нулевое) количество символов, после которых стоит открывающий тег. Ну вот он и находит пустое количество символов перед первым тегом, и дальше не ищет. Чтобы убедиться в том, что соответствие найдено, проверьте так:

text := "<teg_1>Текст между тегами <teg_2> <teg_3>"
MsgBox, % RegExMatch(text, "s).*?(?=<)|.+?>\K[^<>]+", match)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

244 (изменено: kamelotto, 2020-01-29 03:49:55)

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

teadrinker пишет:

В AHK нет такого понятия, как NULL

Тогда почему срабатывает else if (match = NULL) ?

teadrinker пишет:

Первая часть у вас .*?(?=<) — любое (а значит и нулевое) количество символов

Я пробовал вместо * использовать + результат такой : "<teg_2>Текст_между_тегами_"
Шаблон захватывает тег в состав переменной. А мне надо выражение, которое сможет выбрать варианты.

teadrinker пишет:

MsgBox, % RegExMatch(text, "s).*?(?=<)|.+?>\K[^<>]+", match)

Вы правы. Совпадение найдено. Но мне надо проверять по наличию содержания в match, а не начальная позиция совпадения. Поэтому я использовал NULL (Если АНК писался на Си++, значит понятие NULL там есть, как и true, и false)

245

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

kamelotto пишет:

Тогда почему срабатывает else if (match = NULL) ?

match — пустая, NULL — тоже пустая, поэтому match = NULL.

kamelotto пишет:

Я пробовал вместо * использовать + результат такой : "<teg_2>Текст_между_тегами_"

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

RegExMatch(text, "s)[^<>]+?(?=<)|.+?>\K[^<>]+", match)
kamelotto пишет:

Если АНК писался на Си++, значит понятие NULL там есть, как и true, и false

Ну да, в с++ есть, это не означает, что есть и в AHK. В с++ много чего есть, но мы же не пользуемся синтаксисом c++. В AHK true и false тоже фактически нет, это просто замена 1 и 0.

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

246 (изменено: kamelotto, 2020-01-29 11:53:59)

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

teadrinker
Хотите сказать, что NULL — просто очередная переменная, которую я объявил во время написания else if (match = NULL), но она пуста?
Проверил. Я сам создал понятие NULL этот строкой? В моём конкретном коде. Я написал else if (match = Ноль) и сработало точно так же. Кстати этим можно пользоваться

teadrinker пишет:

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

Нет. Это не подходит. Первая часть шаблона не должна была сработать на отсутствие текста до первого тега. В этом случае должна срабатывать вторая часть шаблона и выбирать текст, между тегами. Я понимаю, почему не срабатывает со *(звёздочкой). Но тогда какой должна быть первая часть шаблона, что бы выбор состоялся и выражение смогло совпадать с обоими вариантами строки?

247

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

kamelotto, почему вы не хотите разбить своё задание на части?
Приведите реальный текст с реальными тагами и что вы из него хотите получить в результате.

248 (изменено: kamelotto, 2020-01-29 12:43:48)

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

Malcev
Вариант "по частям" уже есть. И он работает. Я пытаюсь сократить размер кода. А за одно изучить возможности регулярных выражений, в более сложных постановках задачи. Но пока, кажется не реализуемым.

Malcev пишет:

Приведите реальный текст с реальными тагами

Теги могут быть разными. Это зависит от конкретного сайта. Поэтому, я считаю ориентировку на знаки < и >, более универсальной, и при этом надёжной. Ведь теги могут и новые ввести, а эти знаки, точно уже никуда не денутся из языка HTML. Все нужные подстроки могут располагаться только в следующих трёх позициях: Нужный текст<teg>Нужный текст<teg>Нужный текст. То есть: Текст до первого тега, текст между тегами и текст после всех тегов, в конце строки.
Выражение должно срабатывать и помещать в match найденный текст (первый найденный), в случаях работы со строками вида:
Str = Нужный текст<teg>Нужный текст<teg>Нужный текст.
Str = ...<teg>Нужный текст<teg>Нужный текст.
Str = ...<teg><teg>Нужный текст.
Str = ...<teg>Нужный текст<teg>....
Str = Нужный текст (теоритически может возникнуть и строка совсем без тегов)

249

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

kamelotto пишет:

Нет. Это не подходит.

Не очень понял, почему не подходит.

text1 := "Текст до первого тега<teg_1>Текст между тегами <teg_2> <teg_3>"
text2 := "<teg_1>Текст между тегами <teg_2> <teg_3>"
Loop 2 {
   RegExMatch(text%A_Index%, "s)[^<>]+?(?=<)|.+?>\K[^<>]+", match)
   MsgBox, % match
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

250

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

Мне вообще кажется алгоритм ненадежным.
Например, вставят в нужный вам текст перенос строки <br> и скрипт сразу же посчитает это за разделительный таг.

251

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

Malcev Ну и что? Это же будет новая строка. Её мы обработаем тем же способом. Сейчас рассматривается обработка отдельной строки.

252 (изменено: kamelotto, 2020-01-30 02:57:09)

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

teadrinker пишет:

Не очень понял, почему не подходит.

Подходит. Я при проверке случайно за комментировал вашу строку, вместо своей и запустил со своим старым вариантом. Получил естественно некорректную работу. Мой косяк. Ваш вариант работает в трёх обозначенных случаях. Спасибо. Есть, правда, один нюанс, который я не указывал, потому что не думал, что это будет иметь значение. Однако при проверке выяснилось, что это тоже важно. Между тегами иногда может быть один или несколько пробельных символов. Возможно и разных. В этом случае "текст, в конце строки за тегами" и "Текст между тегами"  не отлавливается. Я добавил третью часть, для строки совсем без тегов. Осталось выяснить, что делать, в случае пробела между тегами.

text1 := "Текст до первого тега<teg_1>Текст между тегами <teg_2> <teg_3>"
text2 := "<teg_1> <teg_2>Текст между тегами  <teg_3>"
text3 := "<teg_1><teg_2>Текст между тегами  <teg_3>"
text4 := "<teg_3><teg_3>Текст в конце строки, за тегами."
text5 := "<teg_3> <teg_3>Текст в конце строки, за тегами."
text6 := "Вариант строки совсем без тегов "
Loop 6 {
   RegExMatch(text%A_Index%, "s)[^<>]+?(?=<)|.+?>\K[^<>]+|[^<>]+?$", match)
   MsgBox, % match
}

253

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

Надо как-то показать, что хотя бы один символ должен быть не пробельным. Например:

text1 := "Текст до первого тега<teg_1>Текст между тегами <teg_2> <teg_3>"
text2 := "<teg_1>Текст между тегами <teg_2> <teg_3>"
text3 := "<teg_3> <teg_3>Текст в конце строки, за тегами."
text4 := "Вариант строки совсем без тегов "
Loop 4 {
   RegExMatch(text%A_Index%, "s)([^<>]*[^\s<>][^<>]+)|.+?>\K(?1)|(?1)$", match)
   MsgBox, % match
}

[^<>]*[^\s<>][^<>]+
Здесь
[^<>]* — ноль и более символов, которые не являются тегами
[^\s<>] — один символ, который не пробел и не тег
(?1) — повтор первого подшаблона

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

254 (изменено: kamelotto, 2020-01-30 15:48:15)

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

teadrinker Это уже совсем другое выражение. Не то, что в начале.
Хочу уточнить, правильно ли я понимаю работу регулярок

teadrinker пишет:

([^<>]*[^\s<>][^<>]+)|.+?>\K(?1)|(?1)

Это отдельное условие: [^<>]. В регулярном выражении мы можем указывать несколько условий, как набор фильтров:
"([^<>]* И [^\s<>] И [^<>]+)| ИЛИ .+?>\K И (?1)|ИЛИ (?1)".  В отдельных подшаблонах, условия не заменяют друг друга и не противоречат друг другу, а складываются в один результат. Я правильно понял?

255

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

kamelotto пишет:

([^<>]* И [^\s<>] И [^<>]+)

Нет не правильно. Это не набор фильтров, это описание допустимых символов, но именно в той последовательности, в которой идут части подшаблона:
сначала любое количество не-тегов
затем один не-тег-не-пробел
затем один и более не-тегов (хотя правильнее было бы тоже [^<>]*)

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

256 (изменено: kamelotto, 2020-01-31 03:53:17)

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

Сразу два почему?

teadrinker пишет:

(хотя правильнее было бы тоже [^<>]*)

teadrinker пишет:

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

И почему нужно описывать именно в этой последовательности?

257

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

Нужно в той, в которой идут символы.

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

258

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

Необходимо очистить недавние проекты Premiere Pro, тут прочитал, что необходимо стереть элементы, которые начинаются с "BE.Prefs.MRU." в файле %A_MyDocuments%\Adobe\Premiere Pro\14.0\Profile-%A_UserName%\Adobe Premiere Pro Prefs
Как это сделать? Файл

259

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

Как я вижу, это xml-файл, так что я бы и работал с ним, как с xml:

xmlDoc := ComObjCreate("Msxml2.DOMDocument.6.0")
xmlDoc.Load("D:\Downloads\Adobe Premiere Pro Prefs")
coll := xmlDoc.SelectNodes("//*[starts-with(name(),'BE.Prefs.MRU.')]")
Loop % coll.length
   coll.(A_Index - 1).parentNode().removeChild(coll.(A_Index - 1))
xmlDoc.Save("D:\Downloads\Adobe Premiere Pro Prefs New")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

260

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

Возможно тут получить в Match1 abcdef?
То есть между словесными могут быть цифры или пробелы, но если они есть, то не включать их результат найденного.


Text := " 	abc123 def"
RegexMatch(Text, "(\w+(?:\d+| )*\w+)", Match)
MsgBox % Match1
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

261

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

Нет, в match могут быть только символы, идущие подряд.

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