1 (изменено: DD, 2015-01-18 07:49:47)

Тема: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру

Привет!

Нужно это, в частности, для переноса (в массиве текста) текста сносок — в основной текст.

Задача в том, чтобы находить внутри угловых скобок цифры с текстом следующего вида — [[цифры]любой-текст] — и затем целиком перемещать такое вхождение туда, где в тексте найденным в первом вхождении обрамлённым цифрам соответствуют цифры внутри двойных угловых скобок — [[цифры]]. Т.е., например, находит [[74]текст] и переносит найденное туда, где в тексте стоит [[74]], что в итоге даст — [[74]][[74]текст]. Стало быть, это —

текст[[1]]текст[[2]]текст
текст[[3]]текст
текст
текст[[4]]текст
текст
текст[[1]текст]текст
текст[[2]текст]текст
текст[[3]текст]текст
текст[[4]текст]текст

заменив на это —

текст[[1]][[1]текст]текст[[2]][[2]текст]текст
текст[[3]][[3]текст]текст
текст
текст[[4]][[4]текст]текст
текст
тексттекст
тексттекст
тексттекст
тексттекст

2 (изменено: Irbis, 2015-01-11 11:19:27)

Re: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру

C RegExReplace() компактней получится, но так быстрей.

txt = 
(
текст[[1]]текст[[2]]текст
текст[[3]]текст
текст
текст[[4]]текст
текст
текст[[1]текст]текст
текст[[2]текст]текст
текст[[3]текст]текст
текст[[4]текст]текст
)

while (P1 := 4+StrLen(A_Index)+InStr(txt, "[[" . A_Index . "]]",0,P1)) && (P2 := InStr(txt, "[[" . A_Index . "]",0,P1))
txt := SubStr(txt,1,P1-1) . SubStr(txt,P2,L := 1+InStr(txt,"]",0,P2+3+StrLen(A_Index))-P2)
     . SubStr(txt,P1,P2-P1) . SubStr(txt,P2+L)
MsgBox % txt

Сноски должны идти подряд, т.е. если не существует [[73]], то [[74]] не будет обработана.

+ DD

3

Re: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру

Спасибо огромное!

4 (изменено: DD, 2015-08-07 23:00:50)

Re: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру

Появилась необходимость в обработке не последовательно идущих (как в коде выше), а в обработке произвольных цифр, например 7896555, 67574, 547777, 27 и т.п. Допустимо ли подладить под это код? Если нет, подошла бы однократная обработка для файла с произвольными цифрами, т.е. находит в файле, например,  ^@1999@текст-с-неопределенным-количеством-строк^ и единожды переносит в место, где располагается [[1999]].

Что в итоге даёт: [[1999]]^@1999@текст-с-неопределенным-количеством-строк^.

5 (изменено: serzh82saratov, 2015-08-08 15:39:40)

Re: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру


txt = 
(
[[7896555]]
 
[[1999]]

просто текст
^@1999@текст-с-
неопределенным-количеством-
строк^
^@7896555@текст-с-неопределенным
-количеством-строк^

просто текст
)
 
While % Pos := RegExMatch(txt, "\[\[(\d+)]]", Match, !Pos ? 1 : Pos)
    txt := RegExReplace(txt, "(.*)(\Q" Match "\E)(.*)(\^@" Match1 "@.*?\^)\R?(.*)"
        , "$1$2$4$3$5", , 1, Pos), Pos += StrLen(Match)
MsgBox % txt

На скорую руку. Ограничение: строки вида [[1999]] должны быть выше подходящего под них текста.

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

6

Re: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру

txt = 
( 
^@7896555@текст-с-неопределенным
-количеством-строк^
просто текст
^@1999@текст-с-
неопределенным-количеством-
строк^
[[1999]]
^@7896555@ещё текст^

[[7896555]]
просто текст 
) 

While % Pos := (RegExMatch(txt, "\[\[(\d+)]]", Match, !Pos ? 1 : Pos) + StrLen(Match))
     txt := RegExReplace(RegExReplace(txt, "\^@" Match1 "@.*?\^\R?(?CCallout)"), "(\Q" Match "\E)", "$1" Matches, , 1), Matches := ""
MsgBox % txt
Return

Callout(Match) {
    Global Matches .= Match    
}

При любом расположении, и если строк несколько.

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

7

Re: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру

Огромное спасибо, Серж! Яростно плюсую))

8

Re: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру

А как бы строки с числами в круглых скобках — перенести и вставить после строк, с числами в квадратных скобках? —

СтрокаСтрока[[2222222222]]СтрокаСтрокаСтрока
СтрокаСтрокаСтрокаСтрокаСтрокаСтрокаСтрока
СтрокаСтрокаСтрокаСтрокаСтрокаСтрокаСтрока
СтрокаСтрока[[3563373]]СтрокаСтрокаСтрока
СтрокаСтрокаСтрокаСтрокаСтрокаСтрокаСтрока
СтрокаСтрока((3563373))СтрокаСтрокаСтрока
СтрокаСтрокаСтрокаСтрокаСтрокаСтрокаСтрока
СтрокаСтрока((2222222222))СтрокаСтрокаСтрока
СтрокаСтрока[[2222222222]]СтрокаСтрокаСтрока
СтрокаСтрока((2222222222))СтрокаСтрокаСтрока
СтрокаСтрокаСтрокаСтрокаСтрокаСтрокаСтрока
СтрокаСтрокаСтрокаСтрокаСтрокаСтрокаСтрока
СтрокаСтрока[[3563373]]СтрокаСтрокаСтрока
СтрокаСтрока((3563373))СтрокаСтрокаСтрока
СтрокаСтрокаСтрокаСтрокаСтрокаСтрокаСтрока
СтрокаСтрокаСтрокаСтрокаСтрокаСтрокаСтрока

9 (изменено: DD, 2019-08-13 19:21:44)

Re: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру

10

Re: AHK: Перенос фрагмента нумер-го текста в место, соответствующее номеру

Как вставку производить не в середину строки, а после нее?

txt = 
( 
Строка1Строка[[2222222222]]Строка1Строка1Строка
Строка2Строка2Строка2Строка2Строка2Строка2Строка
Строка3Строка3Строка3Строка3Строка3Строка3Строка
Строка4Строка[[3563373]]Строка4Строка4Строка
Строка5Строка5Строка5Строка5Строка5Строка5Строка
Строка6Строка((3563373))Строка6Строка6Строка
Строка7Строка7Строка7Строка7Строка7Строка7Строка
Строка8Строка((2222222222))Строка8Строка8Строка
) 

While % Pos := (RegExMatch(txt, "\[\[(\d+)]]", Match, !Pos ? 1 : Pos) + StrLen(Match))
     txt := RegExReplace(RegExReplace(txt, "m`a).*?\(\(" Match1 "\)\)[^\R]*\R?(?CCallout)"), "(\Q" Match "\E)", "$1`n" Matches, , 1), Matches := ""
MsgBox % txt
Return

Callout(Match) {
    Global Matches .= Match    
}