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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

261

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

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

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

262 (изменено: inseption86, 2021-01-29 22:28:25)

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

Добрый вечер! Подскажите как получить № дома, но не только цифры ( как в примере), а ещё и символы рядом ("1A", "21/1") ?



name := [ "улица Спасская Большая, дом 10, корпус 1"
, "улица Садовая-Спасская, дом 21/1"
, "улица Большая Переяславская, дом 1A, строение 1"
, "переулок Переяславская, дом 1, строение 1"
, "Большая Переяславская улица , дом 1A, строение 1" ]

for k, v in name
{
    RegExMatch(v, "дом\s(\d+)", out)    
   	MsgBox,% Out1
}
return

263

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

Если ориентироваться до запятой или конца строки.

 RegExMatch(v, "дом\s+(.*?)(:?,|$)", out) 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

264

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

name := [ "улица Спасская Большая, дом 10, корпус 1"
, "улица Садовая-Спасская, дом 21/1"
, "улица Большая Переяславская, дом 1A, строение 1"
, "переулок Переяславская, дом 1, строение 1"
, "Большая Переяславская улица , дом 1A, строение 1" ]

for k, v in name
{
   RegExMatch(v, "\d[^,""]*", out)
   MsgBox, % out
}
return 
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

265

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

teadrinker пишет:

[^,""]

А кавычки зачем?

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

266

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

А, да, не нужны, я почему-то решил, что это часть строки.

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

267

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

teadrinker Спасибо!

268

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

teadrinker
Тогда ты ещё забыл, что бывает улица "улица 50 лет октября".

А может и ещё чего.

 RegExMatch(v, ", дом\s+(.*?)(:?,|$)", out) 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

269

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

Ну, в крайнем случае

RegExMatch(v, "дом\s+\K\d[^,]*", out)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

270 (изменено: inseption86, 2021-01-29 23:10:53)

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

teadrinker
а если есть "дом" и в "д. " или "д." ?

 RegExMatch(v, "дом|\д.\s+\K\d[^,]*", out)

- не подходит.

271

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

RegExMatch(v, "д(ом|\.)\s*\K\d[^,]*", out)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

272

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

teadrinker СпасибО!

273

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

Добрый день! Подскажите пож-та, необходимо вытащить из полного адреса, который записан не по шаблону - улицу или проспект или бульвар или..... . Как получить двойное название (н-р "Большой Афанасьевский") или " 1-й Котельнический" или "Садовая-Сухаревская", или возможно такую регулярку в одну строку, которая  всё выцепит. Заранее спасибо!


#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force 
StringCaseSense,   Locale ; чувствительность к регистру


; текущее время и дата в переменные
FormatTime, TimeString_time, , HH-mm-ss

; переменные на Progress bar
loop 10
{
  flash%A_Index% := A_Index*10
}

Y := A_ScreenHeight- 200
W := "550"


svod = %A_Desktop%\Сводная.xlsx

; открытие книги
Xl := ComObjCreate("Excel.Application")
svod_book := Xl.Workbooks.Open(svod)
xl.visible := true
;~ xl.screenUpdating := 0
 
all_svod := svod_book.workSheets(1).Cells.(svod_book.workSheets(1).Rows.Count, 1).End(xlUp := -4162).Row

Progress,b w%W% y%Y% , Распознование адресов в Сводной .... %A_index% строка из %all_svod%, Loadning.., ( *_* )

loop % all_svod
{
    svod_addres := svod_book.workSheets(1).cells(A_index,1).value := Trim(svod_book.workSheets(1).cells(A_index,1).value) 

    A1 := 
    B1 := 
    Out := 
  
    if Instr(svod_addres, "улица")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)улица", A)    
      RegExMatch(svod_addres, "(*UCP)улица((\w|\s)*)", B)
    }
  
    if Instr(svod_addres, "ул.")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)ул\.", A)    
      RegExMatch(svod_addres, "(*UCP)ул\.((\w|\s)*)", B)
    }
	
    if Instr(svod_addres, "бульвар")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)бульвар", A)    
      RegExMatch(svod_addres, "(*UCP)бульвар((\w|\s)*)", B)
	}
	
    if Instr(svod_addres, "переулок")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)переулок", A)    
      RegExMatch(svod_addres, "(*UCP)переулок((\w|\s)*)", B)
	}
	
    if Instr(svod_addres, "набережная")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)набережная", A)    
      RegExMatch(svod_addres, "(*UCP)набережная((\w|\s)*)", B)
    }
	
    if Instr(svod_addres, "проезд")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)проезд", A)    
      RegExMatch(svod_addres, "(*UCP)проезд((\w|\s)*)", B)
    }
	
    if Instr(svod_addres, "тупик")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)тупик", A)    
      RegExMatch(svod_addres, "(*UCP)тупик(\w|\s)*)", B)
    }
	
    if Instr(svod_addres, "пл.")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)пл\.", A)    
      RegExMatch(svod_addres, "(*UCP)пл\.((\w|\s)*)", B)
	}
    
    if Instr(svod_addres, "пр-кт")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)пр-кт", A)    
      RegExMatch(svod_addres, "(*UCP)пр-кт((\w|\s)*)", B)
	}
    
     if Instr(svod_addres, "проспект")
    {
      RegExMatch(svod_addres, "(*UCP)((\w|\s)\d*)проспект", A)    
      RegExMatch(svod_addres, "(*UCP)проспект((\w|\s)*)", B)
	}

    iF !StrLen(Out :=Trim(A1 B1)) 
    {
      RegExMatch(svod_addres, "(*UCP)^(\w*)", Z)
      Out := Z1
    }
    
    ; вставка полученного результата в заданные столбцы
    svod_book.workSheets(1).cells(A_index,2).value := Out
    
    ; Progress bar
    Progress, , Распознование адресов в Сводной .... %A_index% строка из %all_svod%, Loadning.., ( *_* )
    Progress, %flash4% 
}

; включение обновление экрана
xl.screenUpdating := 1

;сохранение excel
file := A_Desktop "\" svod_book.name  "_проверено_" TimeString_time ".xlsx"
svod_book.SaveAs(file, 51)
svod_book.close(false)

Progress, Off

; проигрывание звука уведомления с увеличенной громкостью +50
SoundSet +50  
SoundPlay, %A_WinDir%\Media\Ring10.wav
SoundSet -50  

MsgBox, 262208, , Готово!
xl.quit
ExitApp

; на закрытие скрипта и excel ( без сохранения)
^esc::
xl.quit
Process, Exist, excel.exe
If errorLevel
{
 MsgBox, 4144, , Все открытые ExceL буду закрыты автоматически!!!!
	Process, close, excel.exe
  }
ExitApp
Post's attachments

Сводная.xlsx 85.74 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

274

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

Добрый день! Подскажите, пож-та, как получить в предпоследней строке "14 с или 14с" и в последней "8" ?


name := [ "Большой Факельный переулок, дом 23"
, "улица Госпитальный Вал, дом 3 строение 2"
, "микрорайон «В», дом 26; 26 (строение 1)"
, "Средняя Калитниковская улица, дом 9/11, строение 1"
, "Жулебинский бульвар, дом 28 корпус 2" 
, "ш. Волоколамское, д. 14 с, стр. 1"
, "Ружейный пер., 8"]

for k, v in name
{
   RegExMatch(v, "д(ом|\.)\s*\K\d[^,|\s|;]*", out)
   MsgBox, % out
}
return

275

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

Здравствуйте, формучане! Написал такой вариант кода, в котором хочу добиться, чтобы предложение разбивалось на отмеченных жирной точкой местах по примерно равным частям по 80 символов (+-). Как лучше это сделать?

text =
(
В одном из писем 1888 года •к Даниэлю Галеви •в ответ на просьбу друга высказать свое мнение •по поводу современной поэзии Пруст пишет: •«Я не являюсь декадентом, •в этом веке •я особенно люблю Мюссе,• старика Гюго,• Мишле,• Ренана,• Сюлли-Прюдома,• Леконта де Лиля,• Галеви,• Тэна,• Бэка,• Франса.

)
   Pos := 1
   While Pos := RegExMatch(text, "m`a)^(.*\R)", zzz, Pos) + StrLen(zzz)
   {
      if StrLen(zzz1) > 80
      {
         len:=StrLen(zzz1)
         len:=len//2
         lenMin:=len-15
         lenMax:=len+15

         zzz1 := RegExReplace(zzz1, "m`a)(.{" lenMin "," lenMax "}([,—•]|$))(.*?\R)", "$1`n`n$3")
         msgbox %zzz1%
      }
   }
return

Хотелось бы такого результата:

В одном из писем 1888 года •к Даниэлю Галеви •в ответ на просьбу друга высказать свое мнение •

по поводу современной поэзии Пруст пишет: •«Я не являюсь декадентом, •в этом веке •я особенно люблю Мюссе,•

старика Гюго,• Мишле,• Ренана,• Сюлли-Прюдома,• Леконта де Лиля,• Галеви,• Тэна,• Бэка,• Франса.

То есть, чтобы обошлось без неполных строк в конце, с небольшим количеством слов.

276

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

peterverhovensky пишет:

80 символов (+-)

Слишком неконкретная задача. Что значит +- ? Например, 40 — это +-? У вас в коде вижу -15 +15. А что, если так не получается?

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

277

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

Действительно, общо изложил. Если не удалось получить -15 или +15, наверно, подошло бы делить строку на ближайшем пробеле в любую сторону.

278

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

Ну, тут RegEx мало поможет. Да и ваш пример не соответствует задаче. Длина строки

по поводу современной поэзии Пруст пишет: •«Я не являюсь декадентом, •в этом веке •я особенно люблю Мюссе,•

107 символов, что не входит в диапазон 80+-15.

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

279

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

То что пример несоответствует, это я сделал допущение, что стоп-символов может не оказаться в нужном месте и захват произойдет чуть дальше, на следующем. Если не RegEx, что можно применить?

280

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

Ничего конкретного, просто парсинг строки, вот например:

text =
(
В одном из писем 1888 года •к Даниэлю Галеви •в ответ на просьбу друга высказать свое мнение •по поводу современной поэзии Пруст пишет: •«Я не являюсь декадентом, •в этом веке •я особенно люблю Мюссе,• старика Гюго,• Мишле,• Ренана,• Сюлли-Прюдома,• Леконта де Лиля,• Галеви,• Тэна,• Бэка,• Франса.
)
len := StrLen(text)
; определяем оптимальную длину части, чтобы части были примерно равными
minDiff := 0xFFFFFFFF
Loop 30 {
   partLen := 96 - A_Index
   rem := mod(len, partLen)
   diff := partLen - rem
   if (diff < minDiff || rem = 0) {
      bestPartLen := partLen
      minDiff := diff
   }
} until rem = 0
partLen := bestPartLen

; разделяем на части и ищем точку в пределах 15 символов от границы
; если не найдено, используем ближайший к границе пробел
str := ""
Loop % len//partLen - (rem = 0) {
   i := A_Index
   delimPos := spacePos := ""
   Loop 15 {
      j := A_Index
      loop 2 {
         char := SubStr(text, p := partLen*i + (A_Index = 1 ? 1 - j : j), 1)
         if (char = "•") {
            delimPos := p
            break 2
         }
         if (char = " " && !spacePos)
            spacePos := p
      }
   }
   delimPos := delimPos ? delimPos : spacePos
   (!start && start := 1)
   str .= SubStr(text, start, l := delimPos - start + 1) . "`r`n"
   start += l
}
str .= SubStr(text, start)
Run, notepad,,, PID
WinWait, ahk_pid %PID%
ControlSetText, Edit1, % str

Не уверен, что алгоритм наиболее оптимальный, но как вариант.

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

281

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

Спасибо!

282 (изменено: peterverhovensky, 2021-02-25 19:00:32)

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

Не могу понять, в каком месте предыдущего кода переменная с текстом очищается, если по количеству символов она меньше "partLen"? Это мне нужно, чтобы короткие строки тоже обрабатывать, но деля их пополам пробелами, а не переводами строк. Тут к примеру 95 символов:


text =
(
В одном из писем 1888 года •к Даниэлю Галеви •в ответ на просьбу друга высказать свое мнение •п
)

283

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

Я не понял сути вопроса. Переменная с текстом вообще не очищается. Зачем нужно делить пополам пробелами? Там же они и так есть.

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

284 (изменено: peterverhovensky, 2021-02-25 21:26:48)

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

То есть, Ваш код при запуске с этим текстом у Вас не возвращает пустое окно Ноутпада?

text =
(
В одном из писем 1888 года •к Даниэлю Галеви •в ответ на просьбу друга высказать свое мнение •п
)

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

285 (изменено: teadrinker, 2021-02-25 21:51:32)

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

Нет, в окне блокнота буква «п». Эта часть кода

minDiff := 0xFFFFFFFF
Loop 30 {
   partLen := 96 - A_Index
   rem := mod(len, partLen)
   diff := partLen - rem
   if (diff < minDiff || rem = 0) {
      bestPartLen := partLen
      minDiff := diff
   }
} until rem = 0

прикидывает, какой размер части примерно должен быть, чтобы все части были примерно одинаковыми. Она начинает сравнение с длины 95 и дальше вычитает по одному 30 раз, то-есть до 66. Если вся длина строки 95 символов, понятно, что равного разделения никак не получится с такими исходными данными. Но вы можете поменять их, заменить 96 меньшим числом, например 60.

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

286 (изменено: BlackCat, 2021-10-03 00:00:46)

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

Подскажите пожалуйста, как правильно сделать шаблон.
Нужно изменить path, содержащий "AppData" на другую директорию.
В варианте %AppData%\Notepad++ и другими подобными этот шаблон работает:

NewPath := RegExReplace(AppPath, "^.*%?AppData%?", "MYFolder\Users\Default\AppData\Roaming")

Однако, у меня есть другие директории, содержащие "AppData", path которых также нужно преобразовать в вид:
"MYFolder\Users\Default\AppData\Roaming\..."

Например такой вариант (может быть и другой):
D:\Components\Content\Users\Default\AppData\Roaming\AnyFolder\...

выдает строку вида:
MYFolder\Users\Default\AppData\Roaming\Roaming\AnyFolder\... (двойной "Roaming")
а нужно так:
MYFolder\Users\Default\AppData\Roaming\AnyFolder\...

Возможно ли за один проход RegExReplace изменить path в этих двух вариантах и как сделать такой шаблон?
Буду признателен за помощь!

287

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

Для начала нужно чётко сформулировать правило, по которому должен меняться ваш path.

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

288 (изменено: Botsy, 2021-10-05 19:31:33)

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

А как добавить обратный слэш перед каждым найденным символом? Для того чтобы экранировать их в строке.

test := "85[3+4jgf.\*ef?^($t6536"
NewStr := RegExReplace(test, "[\[+.\\*?^($)\]]", "")

UPD: решил через "urlencode"

GD

289

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

test := "85[3+4jgf.\*ef?^($t6536"
MsgBox, % NewStr := RegExReplace(test, "[[+.\*?^($)\]]", "\$0")

Но проще через \Q ... \E.

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

290 (изменено: BlackCat, 2021-10-12 15:29:43)

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

Подскажите пожалуйста, как добавить в конец и в начало строки " " (двойные кавычки) в таком варианте:


RegExReplace(A_LoopReadLine, "^.*(Windows|%SystemRoot%|%WinDir%)", A_WinDir)

На выходе строки, содержащие C:\Windows или %SystemRoot% или %WinDir% должны иметь такой вид:
"C:\Windows\blah\blah\..."
Благодарю за помощь!

291

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

Приведите исходный текст.

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

292 (изменено: BlackCat, 2021-10-12 16:06:45)

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

teadrinker это path, записанный в текстовом файле, который считывается скриптом.
Path может быть любым, но вначале строки имеют такой вид:

C:\Windows\xxxx
%SystemRoot%\xxxx
%WinDir%\xxxx

На выхлопе path не должен измениться, переменные винды %SystemRoot% и %WinDir% должны преобразоваться в C:\Windows
и все быть в двойных кавычках
"C:\Windows\xxxx\ ... "

В общем-то, этот вариант работает:

RegExReplace(A_LoopReadLine, "^.*(Windows|%SystemRoot%|%WinDir%)", A_WinDir)

Но у меня не получается обернуть выхлоп в двойные кавычки ...

293

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

text =
(
C:\Windows\xxxx
%SystemRoot%\xxxx
%WinDir%\xxxx
)
MsgBox, % RegExReplace(text, "`ami)^([a-z]:\\Windows|%SystemRoot%|%WinDir%)(\V*)", """" . A_WinDir . "$2""")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

294

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

teadrinker
Почему-то у меня выхлоп на MsgBox:

"C:\Windows\xxxx"
\xxxx
\xxxx

295

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

Если вы запустите мой код, как есть, он должен выдать

"C:\Windows\xxxx"
"C:\Windows\xxxx"
"C:\Windows\xxxx"

если у вас A_WinDir равна "C:\Windows".

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

296

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

teadrinker проблема в #NoEnv
Убрал и все заработало.
А как ее оставить???

297

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

А, да, мой косяк.

#NoEnv
text =
( %
C:\Windows\xxxx
%SystemRoot%\xxxx
%WinDir%\xxxx
)
MsgBox, % RegExReplace(text, "`ami)^([a-z]:\\Windows|%SystemRoot%|%WinDir%)(\V*)", """" . A_WinDir . "$2""")

Но если текст считывается с файла, такого не должно произойти.

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

298

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

Если C:\Windows всегда начинается с C:, то можно заменить [a-z] на C.

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

299

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

teadrinker БОЛЬШОЕ БЛАГОДАРЮ!
Все заработало!
Теперь буду копать, что означает этот код ... пока только пытаюсь въехать в RegEx

300 (изменено: BlackCat, 2021-10-13 14:20:47)

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

teadrinker весьма извиняюсь за беспокойство, но не смог найти инфу про хитрую \V* в конце шаблона.
Пробовал сделать так (.*) - это тоже работает.
Что означает \V и где про нее почитать ???
В справке ничего не нашел ....