201

Re: AHK: Регулярные выражения

Ага, точно.

msgbox % RegexReplace(msg, "^(.*?\R){3}[^\r\n]{0,3}\R?")

202

Re: AHK: Регулярные выражения

stealzy пишет:

Напишите в тему TF, или заведите новую.

Дайте ссылку на тему, пожалуйста.

stealzy, Тема смежная, и так или иначе, как мне кажется, имеет отношение к регулярным выражениям, пусть и заключенных в функции, поэтому, написал здесь.

Malcev, спасибо! Работает.

И все таки, чтобы понять, как правильно пользоваться функцией TF_RemoveLines, стоит создать отдельную тему или все-таки она уже существует в комьюнити?

203

Re: AHK: Регулярные выражения

becauseim, а почему вы выводите переменную msg?
Она же в результате данной функции не меняется.

#include tf.ahk
msg =
(
123
456
789
000000
)
msgbox % TF_RemoveLines(msg, 1,3)
MsgBox % msg

204

Re: AHK: Регулярные выражения

becauseim
Создайте. Я нашёл её упоминание только в этом топике. Здесь оффтоп.

205

Re: AHK: Регулярные выражения

Malcev, понял, спасибо!

206 (изменено: mozers, 2017-04-08 13:30:47)

Re: AHK: Регулярные выражения

becauseim пишет:

я не понимаю, как отредактировать предложенное таким образом, чтобы удалялись не три, а четыре строки с начала текста, а также, например, пять, а не три символов
И предложеный вариант пользователем Malcev не был забракован

Ну если так, то, извините. Тогда все просто:

msg =
(
123
456
789
999999
000000
)
ls := 4 ; кол-во удаляемых строк
cs := 5 ; кол-во удаляемых символов
msgbox % RegexReplace(msg, "^(.*?\R){" ls "}[^\r\n]{0," cs "}\R?")

Модератор: Перенесено из альтернативной темы.

207

Re: AHK: Регулярные выражения

mozers, спасибо! Видимо, я не до конца протестировал и этот вариант, но кажется, выражение удаляет заданное количество символов с первой оставшейся строки после удаленных строк. Т.е. возможности выбрать конкретную строку, в начале которой необходимо удалить символы, не предусмотрено. Иными словами, все желания удовлетворены, кроме одного:

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

208

Re: AHK: Регулярные выражения

becauseim
А теперь тоже самое, но по русски:
Удалить A строк c начала текста. Затем удалить со строки, которая до удаления начальных строк имела номер B, C символов с начала.

msg =
(
1_aaaaaaa
2_bbbbbbbbb
3_ccccc

5_eeee
6_fffffff
7_ggggG
8_hhhhhh
9_iiiiiii
)
a := 5 ; кол-во удаляемых строк в начале
b := 7 ; номер строки в которой будут удалятся символы
c := 6 ; кол-во удаляемых символов в этой строке
msg := RegexReplace(msg, "^(.*?\R){" a "}") ; удаляем начальные строки
b := b - a - 1 ; номер строки в которой будут удалятся символы изменился
msg := RegexReplace(msg, "^((?:.*?\R){" b "})[^\r\n]{0," c "}(\R?)", "$1$2") ; удаляем символы с заданной строки
msgbox % msg

Если я опять тебя не понял - учи русский язык, если понял правильно - учи регулярные выражения - они - сила великая!

209

Re: AHK: Регулярные выражения

mozers, Спасибо! То, что Вы не поняли моей формы изложения, вовсе не указывает на мой уровень знания языка. Что я сделал неправильно - изначально не привлек внимания к тому, что привел в вопросе случайные числа для практического примера, полагая, что это разумеющееся обстоятельство. Ведь сегодня мне может понадобиться удаление трех символов, а завтра уже четырех, например. А то, что для кого-то я остался непонятым даже после соответсвующих уточнений, наводит на другие проблемы, и не мои. Ну, а абсолютное незнание регулярных выражений - безусловно, моя проблема. Буду искать уроков с объяснением на пальцах, чтобы было понятно даже мне. А приводить предмет вопроса впредь постараюсь в форме, приближенной к Вашей.

210

Re: AHK: Регулярные выражения

becauseim, извини если был груб. Просто я сам обычно долго думаю над формулировкой вопроса (отвечаю гораздо быстрее). И, зачастую, пока думаешь и несколько раз переписываешь вопрос чтобы он звучал понятно для всех, решение само приходит в голову.
По поводу регулярных выражений: На этой страничке весьма скромная информация. В инете много более подробной и более легкой для понимания инфы.

211

Re: AHK: Регулярные выражения

becauseim, в русской справке расписаны только шаблоны по RegEx. Примеры с объяснением на пальцах смотрите в английском варианте: RegExMatch() и RegExReplace().

212 (изменено: svoboden, 2017-05-18 07:18:47)

Re: AHK: Регулярные выражения

Вот книгу нашел по регулярным выражениям для AutoHotkey (на английском). Может, для начинающих будет полезной.

213

Re: AHK: Регулярные выражения

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

214

Re: AHK: Регулярные выражения

а подскажите в AHK нормально работает жадность ?  когда при "s" опции используешь .*?
у меня что-то с ними проблема. захватывает больше чем надо хотя должен остановится ? жадность то убрана.
на форуме это обсуждалось? или есть где статься об этом? в мануале все скудно об этом говорится. спасибо.

215

Re: AHK: Регулярные выражения

Если вы считаете, что реализация PCRE в AHK неправильная, где ваш, мать его, код?
Что я могу ответить на беспредметное нытье типа "у меня не работает"?
У меня все работает, если вам интересно. Помог надеюсь.

216 (изменено: mustang, 2017-05-19 18:14:12)

Re: AHK: Регулярные выражения

Возможно дело и не в жадности, может регулярка у меня не правильная.
Мой код парсит html. Не буду его большой тут постить. Приведу пример попроще.
В примере по первому regex находит правильно, 2 варианта.
По второму - я жду от него тоже 2 варианта.
- 1.) "ok this is text 1" и пустое param
- 2.) "ok this is text 2" + "param 2"
... но тут он один раз находит "ok this is text 1" + "param 2"
и на этом закончил. Вот и не пойму куда копать.

В общем может быть много ok this is text 1  ok this is text 2 ok this is text 3  NNNN.... но param может быть, а может и не быть ... а все их надо по порядку перебрать и все сохранить.


string = 
(
ok this is text 1 -----------
lost
lost
ok this is text 2 -----------
param 2
param 3
)

regex := "Ois)(?P<var_text>ok this is text \d+)"

for i,result in RxMatches(string, regex) { 
    MsgBox % "ver.1 = " . result.var_text
}

regex := "Ois)(?P<var_text>ok this is text \d+)(.+?param (?P<var_num>\d+))?"

for i,result in RxMatches(string, regex) { 
    MsgBox %  "ver.2 = " . result.var_text . " ---- " . result.var_num
}


; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FUNC - INIT

RxMatches(Haystack, Needle) {
    Result := [] ;new MatchCollection()
    start = 1
    loop
    {
        if(!RegexMatch(haystack, needle, M, start)) 
            break

        Result.Insert(M)
        start := M.Pos + M.Len
    }

    return Result
}
ExitApp

217

Re: AHK: Регулярные выражения

mustang, расставьте заглавные буквы и знаки препинания в своих сообщениях.
http://forum.script-coding.com/viewtopi … 55#p115655
http://forum.script-coding.com/viewtopi … 64#p115664
http://forum.script-coding.com/viewtopi … 37#p115937
http://forum.script-coding.com/viewtopi … 40#p115940

218 (изменено: Malcev, 2017-05-19 19:17:45)

Re: AHK: Регулярные выражения

mustang, если в чем-то сомневаетесь, то проверяйте на простейшем примере:

var := "abcXYZ123123"
RegExMatch(var, "s)abc.*123", SubPat)
msgbox % SubPat
RegExMatch(var, "s)abc.*?123", SubPat)
msgbox % SubPat

219

Re: AHK: Регулярные выражения

ypppu, это да, если бы не было кнопки перевести эту страницу.

220

Re: AHK: Регулярные выражения

Если новичок поймёт машинный перевод, значит он не такой уж новичок.

221

Re: AHK: Регулярные выражения

Здравствуйте, имеется следующий текст:


[17:36:30]  Max_Reelood[34] [тел: 454660]
[17:36:30]  Sara_Kinoshita[81] [тел: 589941]
[17:36:30]  Vadim_Ernestto[113] [тел: 901777]
[17:36:30]  Brabus_Binjo[148] [тел: 55329]
[17:36:30]  Dimas_Kozlov[252] [тел: 782006]
[17:36:30]  Jek_Savage[278] [тел: 752324]
[17:36:30]  Frank_Castello[371] [тел: 231541]
[17:36:30]  Nekit_Joker[437] [тел: 819062]
[17:36:30]  vasilia_harlamov[457] [тел: 499172]
[17:36:30]  Andrey_Derix[564] [тел: 221539]

Количество подобных строк может быть разным: от нуля до бесконечности, время, имена, id (это цифра в [] сразу после имени), а так же номера телефонов могут быть разными, но точно известно, что каждый параметр, кроме времени, в одной строке, отличается от соответствующих параметров другой строки (т.е. не будет одинаковых id, имен или телефонов). Нужно вывести все id в массив, либо во внешний файл. Пока что мне пришла в голову идея отсекать переменные в RegExMatch, но у меня ничего не получилось. Пытался играться с break/continue - тоже ничего. Подскажите что можно сделать, предоставляю код, эта часть обязательно должна быть в поиске (сейчас она возвращает только один id).


	log := {str:"",find:0,num:0}    ,    log.str := []
	Loop, read, %path_log%
	log.str.Insert(A_LoopReadLine)    ,log.num := A_Index
	loop 50
		if RegExMatch(log.str[log.num + 1 - A_Index],"\[(.*)\]  (.*)_(.*)\[(.*)\] \[тел: (.*)\]", mn) and (log.find:=log.num + 1 - A_Index)
	break
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

222 (изменено: teadrinker, 2017-06-30 20:38:03)

Re: AHK: Регулярные выражения

text =
(
[17:36:30]  Max_Reelood[34] [тел: 454660]
[17:36:30]  Sara_Kinoshita[81] [тел: 589941]
[17:36:30]  Vadim_Ernestto[113] [тел: 901777]
[17:36:30]  Brabus_Binjo[148] [тел: 55329]
[17:36:30]  Dimas_Kozlov[252] [тел: 782006]
[17:36:30]  Jek_Savage[278] [тел: 752324]
[17:36:30]  Frank_Castello[371] [тел: 231541]
[17:36:30]  Nekit_Joker[437] [тел: 819062]
[17:36:30]  vasilia_harlamov[457] [тел: 499172]
[17:36:30]  Andrey_Derix[564] [тел: 221539]
)
arr := StrSplit( RegExReplace(text, "m`a)^\[.*?][^\[]+\[(\d+).*$", "$1"), "`n", "`r")

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

223 (изменено: belyankin12, 2017-06-30 20:52:33)

Re: AHK: Регулярные выражения

teadrinker, это понятно, только не все так гладко: изначально у меня нету переменной text (ну т.е. всех нужных мне строк сразу, они извлекаются через Loop по одной), потому извлечь со всех строк сразу вашим способом не получится. Последний код, который я привел в предыдущем сообщении, должен обязательно быть в решении, т.к. это единственный подходящий способ добычи строк из текстового файла в моем случае.

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

224

Re: AHK: Регулярные выражения

belyankin12, логика вашего кода мне непонятна. Что должно быть в ключах find и num? Почему именно Loop 50, а не 49, или 100500? И почему, наконец, нельзя считать всё содержимое файла в переменную сразу?

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

225

Re: AHK: Регулярные выражения

Loop 50 - это проверка 50 последних строк. А все что выше - это настройка чтения снизу вверх. А насчёт всего файла: можно и весь считать, как вам удобнее.

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

226

Re: AHK: Регулярные выражения

А нужно именно 50 последних сорок, и именно «снизу вверх»?

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

227

Re: AHK: Регулярные выражения

Да, именно снизу вверх и 50 строк, т.к. этот список мог пробиваться ранее и если читать больше строчек, то скрипт дойдет до устаревшего списка, определяя уже недействительные id.

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

228

Re: AHK: Регулярные выражения

FileRead, text, %path_log%

arr := []
Sort, text, F Reverse
Loop, parse, text, `n, `r
   arr.Push( RegExReplace(A_LoopField, ".*\[(\d+)].*", "$1") )
until A_Index = 50

MsgBox, % arr[1]

Reverse(a1, a2, offset)  {
    return offset
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

229

Re: AHK: Регулярные выражения

teadrinker, отлично, это подходит, спасибо.

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

230

Re: AHK: Регулярные выражения

А вы обновляемый лог файл периодически читаете?

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

231 (изменено: teadrinker, 2017-07-01 20:09:32)

Re: AHK: Регулярные выражения

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

FilePath := A_Temp . "\test.log"

text =
(
[17:36:30]  Max_Reelood[34] [тел: 454660]
[17:36:30]  Sara_Kinoshita[81] [тел: 589941]
[17:36:30]  Vadim_Ernestto[113] [тел: 901777]
[17:36:30]  Brabus_Binjo[148] [тел: 55329]
[17:36:30]  Dimas_Kozlov[252] [тел: 782006]
[17:36:30]  Jek_Savage[278] [тел: 752324]
[17:36:30]  Frank_Castello[371] [тел: 231541]
)

FileAppend, % text, % FilePath

oFile := FileOpen(FilePath, "r")
MsgBox,, Начальный текст, % oFile.Read()
pos := oFile.Pos
oFile.Close()

newText =
(

[17:36:30]  Nekit_Joker[437] [тел: 819062]
[17:36:30]  vasilia_harlamov[457] [тел: 499172]
[17:36:30]  Andrey_Derix[564] [тел: 221539]
)

FileAppend, % newText, % FilePath

FileRead, text, % FilePath
MsgBox,, Полный текст файла с добавленными строками, % text

; но можно перейти сразу к последней запомненной позиции
oFile := FileOpen(FilePath, "r")
oFile.Pos := pos
; только новый текст с обрезанным переносом строки
MsgBox,, Только новый текст, % Trim(oFile.Read(), "`r`n")

oFile.Close()
FileDelete, % FilePath

Достаточно сохранять значение pos от предыдущего чтения.

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

232

Re: AHK: Регулярные выражения

Привет! С какой командой можно из первого получить второй вариант, — то есть, чтобы строки, начинающиеся на "F:\" копировались во все нижеследующие строки своей группы?


F:\eashp\c\exlibris\a\abashidze
<a href="p/t-abashidze-2652">
<a href="p/tamaz-abashidze-1254">
<a href="p/tamaz-abashidze-1252">
F:\eashp\c\exlibris\a\achttienribbe
<a href="p/achttienribbe-p-6915">
<a href="p/achttienribbe-p-6914">
<a href="p/achttienribbe-p-6913">
<a href="p/achttienribbe-p-6912">
<a href="p/p-achttienribbe-2230">
<a href="p/p-achttienribbe-2227">
<a href="p/p-achttienribbe-2224">
F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5760">
<a href="p/acket-d-5759">
<a href="p/acket-d-5758">
<a href="p/acket-d-5757">
<a href="p/acket-d-5755">

<a href="p/t-abashidze-2652">F:\eashp\c\exlibris\a\abashidze
<a href="p/tamaz-abashidze-1254">F:\eashp\c\exlibris\a\abashidze
<a href="p/tamaz-abashidze-1252">F:\eashp\c\exlibris\a\abashidze

<a href="p/achttienribbe-p-6915">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/achttienribbe-p-6914">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/achttienribbe-p-6913">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/achttienribbe-p-6912">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/p-achttienribbe-2230">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/p-achttienribbe-2227">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/p-achttienribbe-2224">F:\eashp\c\exlibris\a\achttienribbe

<a href="p/acket-d-5760">F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5759">F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5758">F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5757">F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5755">F:\eashp\c\exlibris\a\acket

233

Re: AHK: Регулярные выражения

Как первый пример преобразовать во второй? —


§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline

§50§linelinelinelinelineline
§50§linelinelinelinelinelineline
§50§linelinelinelinelinelineline
§50§linelinelinelinelinelineline
§52§linelinelinelinelineline
§52§linelinelinelinelinelineline
§52§linelinelinelinelinelineline
§52§linelinelinelinelinelineline
§line§linelinelinelinelineline
§line§linelinelinelinelinelineline
§line§linelinelinelinelinelineline

234

Re: AHK: Регулярные выражения

В одну строчку наверно никак.

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

235 (изменено: stealzy, 2017-09-01 03:58:22)

Re: AHK: Регулярные выражения

DD, если ответите как заменить "§129§qwerty " на "§129§qwerty§129§ ", тогда дам вам готовый регексп.
teadrinker, в одну строчку, но прошу воздержаться.

236 (изменено: DD, 2017-09-01 04:05:48)

Re: AHK: Регулярные выражения

teadrinker, подошло бы и не в одну строчку .

stealzy, так вроде: "^(§\d+§)(.*)$" на "$1$2$1".

237 (изменено: stealzy, 2017-09-01 04:14:57)

Re: AHK: Регулярные выражения

Суть поймали, "(§\w+§)(\w+\r\n)(?!§)" на "$1$2$1", проверено в np++. Единственная фишка - отрицательная вперед смотрящая группа, чтобы не было лишних замен. Обозначения вперед/назад смотрящих групп я никак не запомню, просто знаю об их наличии, и когда нужно, смотрю шпоргалку.

+ regex

https://devaka.ru/wp-content/uploads/2014/06/1599.png

238

Re: AHK: Регулярные выражения

stealzy пишет:

teadrinker, в одну строчку

stealzy пишет:

"(§\w+§)(\w+\r\n)(?!§)" на "$1$2$1", проверено в np++

Я чёт не уловил.

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

239

Re: AHK: Регулярные выражения

teadrinker, разве строчка не одна, или что имелось ввиду?

240

Re: AHK: Регулярные выражения

Строчка одна, а полностью код можно?

text =
(
§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)

MsgBox, А тут что?
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

241 (изменено: DD, 2017-09-01 04:39:11)

Re: AHK: Регулярные выражения

Примерно по такому принципу я тоже делал, в Notepad++ команда работает, если выполнять по клавише строку за строкой, количество которых может доходить до трёх сотен, как в моём случае . Но если пробовать на AHK с циклом — вообще не фурычит:


text =
(
§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)
loop 10 
text := RegexReplace(text, "(§\w+§)(.*?\n)(?!§)", "$1$2$1")
msgbox % text

UPD: А-а, не прав: дело было в концах строк, убрал \r и работает)). Спасибо!

242

Re: AHK: Регулярные выражения

Я думал, правда в одну строчку будет.

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

243 (изменено: stealzy, 2017-09-01 04:53:35)

Re: AHK: Регулярные выражения

Если про строчку кода, то надо подумать. Увы вперед/назад смотрящие группы не поддерживают модификаторы в данной реализации, иначе бы получилось за один регекс.
DD, убирать \r некрасиво, потому что переносы всякие бывают.

v1.0.47.05+, \R can be restricted to CR, LF, and CRLF

str=
(
§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)

Loop {
	str := new_str ? new_str : str
	new_str := RegExReplace(str, "(§\w+§)(\w+\R)(?!§)", "$1$2$1")
} Until (str = new_str)

MsgBox % new_str
+ DD

244

Re: AHK: Регулярные выражения

Лимит в строку для Regex — это правило какое-то?)) И возможна ли отрицательная вперед смотрящая группа не для одного символа, а для нескольких — тега, например?

245

Re: AHK: Регулярные выражения

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

246 (изменено: DD, 2017-09-01 05:33:43)

Re: AHK: Регулярные выражения

Оказалось, что если изменить, как ниже — пустые или строки, следующие после строки с пробелом в группе, не затрагиваются:


str=
(
§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
   linelinelinelinelinelineline
linelinelinelinelinelineline


linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)

Loop {
	str := new_str ? new_str : str
	new_str := RegExReplace(str, "s)(§\w+§)(\w+\R)(?!§|\R)", "$1$2$1")
} Until (str = new_str)

MsgBox % new_str

247 (изменено: DD, 2017-09-01 04:58:31)

Re: AHK: Регулярные выражения

stealzy пишет:

Почему нет

А какая это, я давно ищу?)) Даже в этой теме задавал вопрос)).

248 (изменено: stealzy, 2017-09-01 05:12:50)

Re: AHK: Регулярные выражения

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

249 (изменено: DD, 2017-09-01 05:16:18)

Re: AHK: Регулярные выражения

Это давняя мечта, спасибо!

250 (изменено: DD, 2017-09-01 05:26:02)

Re: AHK: Регулярные выражения

Не пойму, почему <dd>50<dd> повторно появляется в нижней части вывода? —


str=
(
<dd>50<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
<dd>52<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
<dd>line<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)

Loop {
	str := new_str ? new_str : str
	new_str := RegExReplace(str, "s)(<dd>\w+<dd>)(.*?\R)(?!<dd>)", "$1$2$1")
} Until (str = new_str)

MsgBox % new_str

251 (изменено: stealzy, 2017-09-01 12:57:19)

Re: AHK: Регулярные выражения

Потому что шаблон .* включает в себя и знаки <>.

str=
(
<dd>50<dd>linelinelinelinelineline
linelinelinelinelinelineline
<dd>52<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline

linelinelinelinelinelineline
linelinelinelinelinelineline
<dd>line<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)
MsgBox % MultiRegExReplace(str, "(<dd>\w+<dd>)(\w*?\R+)(?!<dd>|\R)", "$1$2$1")
Return

; рекурсивная ф-ия, делающая замены, пока существуют подходящие под условия замены подстроки
MultiRegExReplace(str, regex, replacement) {
	Return str = (next_str := RegExReplace(str, regex, replacement))
	 ? str
	 : MultiRegExReplace(next_str, regex, replacement)
}

teadrinker, ф-ию в одну строку можно записать, если что .

252

Re: AHK: Регулярные выражения

А почему пример не обрабатывает строки с добавленными пробелами и т.д., даже если «\w*?» заменить на «.*»?

253 (изменено: stealzy, 2017-09-01 15:51:44)

Re: AHK: Регулярные выражения

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

254

Re: AHK: Регулярные выражения

stealzy пишет:

teadrinker, ф-ию в одну строку можно записать, если что

В javascript разве что, но у нас AHK.

stealzy пишет:
<dd>\w+<dd>

А что, между тегами могут быть только символы, подходящие под \w?

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

255 (изменено: stealzy, 2017-09-01 16:02:47)

Re: AHK: Регулярные выражения

teadrinker, К.О.?
Очевидно подразумевались строки кода ф-ии, а не кол-во строк, которое занимает определение ф-ии целиком.

teadrinker пишет:

А что, между тегами могут быть только символы, подходящие под \w?

А ТЗ тут не вы диктуете, претензии не надо мне предъявлять... Более того, я скопировал эту часть из кода DD выше, думаю ему виднее.

256

Re: AHK: Регулярные выражения

stealzy, под "line" и имелась в виду строка, которая может включать любые символы. Касаемо жадности, если не путаю: так тоже не работает — .*?.

257

Re: AHK: Регулярные выражения

У меня работает:

str=
(
<dd>50<dd>lineli nelin elinelineline
linelinelinel inelinelineline
<dd>52<dd>linelinelinelinelineline
linelinelinelinelinelineli ne
linelinel inelinelinelineline

linelinelineline linelineline
linelinelinelineli nelineline
<dd>line<dd>linel inelinelinelineline
linelin elinelinelinelineline
linelinelinelinelinel ineline
)
MsgBox % MultiRegExReplace(str, "(<dd>\w+<dd>)(.*?\R+)(?!<dd>|\R)", "$1$2$1")
Return

; рекурсивная ф-ия, делающая замены, пока существуют подходящие под условия замены подстроки
MultiRegExReplace(str, regex, replacement) {
	Return str = (next_str := RegExReplace(str, regex, replacement))
	 ? str
	 : MultiRegExReplace(next_str, regex, replacement)
}

258

Re: AHK: Регулярные выражения

stealzy пишет:

Очевидно подразумевались строки кода ф-ии, а не кол-во строк, которое занимает определение ф-ии целиком.

А какой в этом тогда смысл, не пойму? Я-то имел в виду решение, занимающее одну строчку кода. Да, по всей видимости К. О.

stealzy пишет:

А ТЗ тут не вы диктуете, претензии не надо мне предъявлять

Я не заметил, где в ТЗ сказано про то, что между тегами могут быть только символы, соответствующие \w.

stealzy пишет:

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

Так а он её скопировал из вашего прошлого кода. Если бы ему было виднее, он бы тут не задавал вопросы, а отвечал на них.

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

259 (изменено: DD, 2017-09-01 16:09:40)

Re: AHK: Регулярные выражения

Так число "50" снова вклинивается после "52".

260 (изменено: DD, 2017-09-01 16:16:41)

Re: AHK: Регулярные выражения

teadrinker пишет:

Если бы ему было виднее, он бы тут не задавал вопросы, а отвечал на них.

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

261 (изменено: stealzy, 2017-09-01 16:19:09)

Re: AHK: Регулярные выражения

MultiRegExReplace(str, "(<dd>[^\n\r]+?<dd>)([^\n\r]+?\R+)(?!<dd>|\R)", "$1$2$1")
Ограничения все таки есть, раз символ переноса строки не подходит.
Конструкция [^\R] почему то отказывает.

+ DD

262

Re: AHK: Регулярные выражения

stealzy пишет:

Конструкция [^\R] почему то отказывает.

In v1.0.46.06+, \R means "any single newline of any type", namely those listed at the `a option (however, \R inside a character class is merely the letter "R").

https://autohotkey.com/docs/misc/RegEx-QuickRef.htm
Я подобные задачи решал через RegexMatch в цикле.

263

Re: AHK: Регулярные выражения

Кстати, код работает неверно (нет привязки к началу строки):

str=
(
test<dd>50<dd>lineli nelin elinelineline
linelinelinel inelinelineline
<dd>52<dd>linelinelinelinelineline
test<dd>50<dd>lineli nelin elinelineline
linelinelinel inelinelineline
)

msgbox % MultiRegExReplace(str, "(<dd>[^\n\r]+?<dd>)([^\n\r]+?\R+)(?!<dd>|\R)", "$1$2$1")

; рекурсивная ф-ия, делающая замены, пока существуют подходящие под условия замены подстроки
MultiRegExReplace(str, regex, replacement) {
	Return str = (next_str := RegExReplace(str, regex, replacement))
	 ? str
	 : MultiRegExReplace(next_str, regex, replacement)
}

264

Re: AHK: Регулярные выражения

По-моему, даже в том случае, когда работает, то работает не идеальным образом. Дело в том, что в цикле (или при рекурсии) текст каждый раз просматривается с самого начала, хотя в этом нет никакого смысла.

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

265

Re: AHK: Регулярные выражения

Интересно, возможен ли вариант не на RegEx? Потому что производительности не достаёт — на файле в 6 тысяч строк комп завис, хотя помимо других, стояла директива #MaxMem 400. Еще минут пять пытался процесс закрыть)). Не будет ли без RegEx быстрее?

266

Re: AHK: Регулярные выражения

Приведите пример файла.

267 (изменено: stealzy, 2017-09-02 10:35:24)

Re: AHK: Регулярные выражения

Рекурсивные ф-ии жрут память, лучше переделать в цикл, а для ускорения избавиться от RegEx по всему содержимому файла.
Делайте цикл по строкам Loop, parse, FileContents, `n, `r, сохраняйте последний тег (извлекать его все еще можно RegEx-ом) и вставляйте в начало следующих строк, где тег не найден.

268

Re: AHK: Регулярные выражения

С каким шаблоном можно из первого варианта получить второй? —


^symbolssymbolssymbols27551,29397,29387,29367,29354symbolssymbolssymbols$

=27551
=29397
=29387
=29367
=29354

269 (изменено: DD, 2018-03-16 20:11:18)

Re: AHK: Регулярные выражения

Можно ли это сделать, применив один шаблон?


Src =
(
symbolssymbolssymbols27551,29397,29387,29367,29354,29344,29328,29323,29317,29311,29303,29296,29267,29249,29237symbolssymbolssymbols
)

Src := RegExReplace(Src, "\D+", "`n=$1") 

MsgBox, %Src%

270

Re: AHK: Регулярные выражения

Src =
(
symbolssymbolssymbols27551,29397,29387,29367,29354,29344,29328,29323,29317,29311,29303,29296,29267,29249,29237symbolssymbolssymbols
)

Src := RegExReplace(Src, "\D*(\d+)\D+", "=$1`n") 

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

271 (изменено: DD, 2018-03-22 18:43:42)

Re: AHK: Регулярные выражения

272 (изменено: DD, 2018-05-02 14:38:56)

Re: AHK: Регулярные выражения

«Пройдя мимо длинных рядов всяких товаров, я подошел к рабочим, медленно катившим нагруженный вагон. Передвижение на себе вагонов и очистку платформ от снега, как я узнал потом, рабочие обязаны делать бесплатно. Это стоит и в печатном условии. Рабочие были такие же оборванные и исхудалые, как и те, с которыми я говорил. Когда они докатили вагон до места и остановились, я подошел к ним и спросил, когда они стали на работу и когда обедали. Мне ответили, что стали на работу в 7 часов, а обедали только сейчас. Так по работе надо было, не отпускали.»

Можно ли составить выражение, которое выделит в тексте указанные слова, находящиеся в любом порядке и на расстоянии не более чем 10 слов друг от друга? К примеру, эти: вагон\w+ подошел\w+?

273

Re: AHK: Регулярные выражения

Что вы понимаете под "вагон\w+"? Может быть "вагонов"?

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

274 (изменено: DD, 2018-05-03 04:53:24)

Re: AHK: Регулярные выражения

Это я добавил на случай, если слова будут в падеже, с изменяемой частью: вагоны, вагонов и т.п. А слово "вагонов" — одиннадцатое по счёту и как бы не должно попасть в результат.

275

Re: AHK: Регулярные выражения

Не понял всё равно. Если задано "вагон", то нужно искать и "вагонов"?

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

276

Re: AHK: Регулярные выражения

Нужны любые формы слов "вагон" и "подошел", которые находятся друг от друга на расстоянии 10 слов.

277

Re: AHK: Регулярные выражения

А какие формы могут быть у слова "подошел\w+"?

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

278 (изменено: DD, 2018-05-03 05:15:02)

Re: AHK: Регулярные выражения

Как уже сказал, это было предусмотрено на случай, если в словах окончания будут, чтобы они учитывались, чтобы затем мои правки не сделали шаблон нерабочим. То есть, находится слово "подошел" с неким возможным окончанием (как если бы оно могло быть), затем до десяти слов от слова "подошел". Первым в примере будет найден "вагон" без окончания — поэтому в этом месте поиск обрывается, найденное обрамляется (например) и продолжается новый поиск соответствий. Дальше идёт "вагонов", после которого нет слова "подошел" на заданном расстоянии, поэтому следующая пара будет найдена через несколько предложений. Схема такая:

подошел\w+ [до десяти слов] вагон\w+
вагон\w+ [до десяти слов] подошел\w+

279

Re: AHK: Регулярные выражения

А если первым найдено "подошел\w", то следующим должно быть "вагон\w", или может быть опять "подошел\w"?

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

280

Re: AHK: Регулярные выражения

Да, если первым найдено "подошел\w", то следующим должно быть "вагон\w" — и наоборот.

281

Re: AHK: Регулярные выражения

Боюсь, одним выражением такое недостижимо.

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

282 (изменено: DD, 2018-05-03 12:23:02)

Re: AHK: Регулярные выражения

Недостижимо однократно найти от слова до слова в диапазоне десяти слов, — то есть, захватить слова

[подошел\w+|вагон\w+].*?[подошел\w+|вагон\w+]

и до десяти слов между ними? Это из-за возможной пунктуации между слов?

283

Re: AHK: Регулярные выражения

Не знаю, как указать что второе вхождение шаблона не должно соответствовать первому.

text =
(
Пройдя мимо длинных рядов всяких товаров, я подошел к рабочим, медленно подошел нагруженный вагон. Передвижение на себе вагонов и очистку платформ от снега, как я узнал потом, рабочие обязаны делать бесплатно. Это стоит и в печатном условии. Рабочие были такие же оборванные и исхудалые, как и те, с которыми я говорил. Когда они докатили вагон до места и остановились, я подошел к ним и спросил, когда они стали на работу и когда обедали. Мне ответили, что стали на работу в 7 часов, а обедали только сейчас. Так по работе надо было, не отпускали.
)

while RegExMatch(text, "O)(*UCP)((подошел|вагон)\w*)(\W+\w+){1,10}?\W+(?1)(?=\W)", match, match ? match.Pos + match.Len : 1)
   MsgBox, % match[0]

Хотя не исключаю, что это всё-таки как-то возможно, используя "Special Backtracking Control Verbs".

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

284 (изменено: DD, 2018-05-04 11:26:08)

Re: AHK: Регулярные выражения

А возможен ли будет в рамках одного шаблона формат с перебором двух вариантов, прописанных через «|» — с поиском сначала «подошел ... вагон», а потом  «вагон ... подошел»? Пробовал это на примере — не сработало.

285 (изменено: DD, 2018-05-04 18:26:32)

Re: AHK: Регулярные выражения

Вот так вроде пошло, спасибо:


text =
(
Пройдя мимо длинных рядов всяких товаров, я _подошел к рабочим, медленно подошел нагруженный вагон_. Передвижение на себе вагонов и очистку платформ от снега, как я узнал потом, рабочие обязаны делать бесплатно. Это стоит и в печатном условии. Рабочие были такие же оборванные и исхудалые, как и те, с которыми я говорил. Когда они докатили _вагон до места и остановились, я подошел_ к ним и спросил, когда они стали на работу и когда обедали. Мне ответили, что стали на работу в 7 часов, а обедали только сейчас. Так по работе надо было, не отпускали.
Пройдя мимо длинных рядов всяких товаров, я _подошел к рабочим, медленно подошел нагруженный вагон_. Передвижение на себе вагонов и очистку платформ от снега, как я узнал потом, рабочие обязаны делать бесплатно. Это стоит и в печатном условии. Рабочие были такие же оборванные и исхудалые, как и те, с которыми я говорил. Когда они докатили _вагон до места и остановились, я подошел_ к ним и спросил, когда они стали на работу и когда обедали. Мне ответили, что стали на работу в 7 часов, а обедали только сейчас. Так по работе надо было, не отпускали.
)
while RegExMatch(text, "O)(*UCP)(подошел\w*)(\W+\w+){1,10}?\W+(вагон\w*)|(вагон\w*)(\W+\w+){1,10}?\W+(подошел\w*)", match, match ? match.Pos + match.Len : 1)
   MsgBox, % match[0]

А это в шаблоне перебор от одного до десяти слов? — «(\W+\w+){1,10}?\W+»?

286

Re: AHK: Регулярные выражения

Да.

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

287

Re: AHK: Регулярные выражения

Как задать шаблон для поиска одного или нескольких </div>, чтобы находились следующие варианты? —

...
</div></div></div></div></div>
</div></div></div></div>
</div></div></div>
</div></div>
</div>

288

Re: AHK: Регулярные выражения

В предыдущем ответе использовали же этот шаблон: {1,10}.

289

Re: AHK: Регулярные выражения

А как применять?

match4 =
(
</div></div></div></div>
)
   match4 := RegExReplace(match4, "s)(</div>{1,10}?)", "«$1»")

MsgBox % match4

290

Re: AHK: Регулярные выражения

В справке же все написано:

{min,max}
Означает, что предыдущий элемент (символ, символ из перечня, или подшаблон) может быть повторен некоторое число раз.

В круглые скобки заключают группы элементов, чтобы:

    Определить порядок оценивания. Например, стол(|а|у|ом|е) соответствует падежам слова стол.
    Применять *, ?, +, и {min,max} к последовательности символов, а не к одному символу. Например, (пра)+ совпадает с повторяющейся приставкой "пра"; таким образом, находит "праправнук" и "прапрапрадед", но не находит "предок".
    Выделить некоторый подшаблон, например точка-звездочка: abc(.*)xyz.

291 (изменено: DD, 2018-05-14 23:01:07)

Re: AHK: Регулярные выражения

Пробовал по-всякому, не идет. Мне надо, чтобы в результате в кавычки обернулись все </div>, при том что в поиске будет указан — один </div>.

292

Re: AHK: Регулярные выражения

DD пишет:
match4 := RegExReplace(match4, "s)(</div>{1,10}?)", "«$1»")

У вас {1,10} здесь к чему относится? Вопросительный знак что означает?

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

293 (изменено: DD, 2018-05-14 22:55:09)

Re: AHK: Регулярные выражения

Это я в свете совета Malcev'а просто прикидывал. Так тоже не вытанцовывается —

match4 =
(
</div></div></div></div></div></p>
)
   match4 := RegExReplace(match4, "s)([</div>]+)", "«$1»")

MsgBox % match4

294

Re: AHK: Регулярные выражения

Это легко проверить:

match4 =
(
<<<<<<<<#NoTrayIcon
)
   match4 := RegExReplace(match4, "s)([</div>]+)", "«$1»")

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

295

Re: AHK: Регулярные выражения

Или как я отредактировал в предыдущем посте... Но как же правильно?

296

Re: AHK: Регулярные выражения

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

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

297

Re: AHK: Регулярные выражения

DD, а зачем вы квадратные скобки используете?

var = aaaababbb
RegExMatch(var, "[ab]+", match)
MsgBox % match
RegExMatch(var, "(ab)+", match)
MsgBox % match
+ DD

298

Re: AHK: Регулярные выражения

Ах вон оно как)). Спасибо!

299

Re: AHK: Регулярные выражения

Пробовал искать при помощи RegExMatch текст, заключённый между двумя тегами. Исходные данные брал из текстового файла.

RegExMatch(My_text, "<data>(.+?)</data>", match)
Result := match1

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

300

Re: AHK: Регулярные выражения

Попробуй добавить s в опции (dot all).

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