226

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

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

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

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

229

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

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

230

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

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

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

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

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

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

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