1

Тема: AHK: Regexreplace, чтение секции файла INI

Не могу разобраться с Regexreplace.
Пытаюсь считать файл ini секциями.
Первые 4 считываются нормально. Условие для последней секции не пойму как написать.

INI=
(
[S1]
key1=value1[S3]
key2=value2
[S2]
key3=value3
key4=value4[[
[S3]
key5=value5]]
key6=value6[S3]
[S4]
key7=value7][
key8=value8[s5]
[S5]
key9=value9[
key10=value10[
)

MsgBox % ReadINI("S1")
MsgBox % ReadINI("S2")
MsgBox % ReadINI("S3")
MsgBox % ReadINI("S4")
MsgBox % ReadINI("S5")
return

ReadINI(Section)
{
    global INI
    Pattern =
    (LTrim Join
        (.*\R)*
        \[%Section%\]\R
        (?U)
        ((.*\R)*)
        (?-U)
        \[.*?\]\R
        (.*\R)*.*
    )
        return RegExReplace(INI, pattern, "$2")
}

2

Re: AHK: Regexreplace, чтение секции файла INI

INI=
(
[S1]
key1=value1[S3]
key2=value2
[S2]
key3=value3
key4=value4[[
[S3]
key5=value5]]
key6=value6[S3]
[S4]
key7=value7][
key8=value8[s5]
[S5]
key9=value9[
key10=value10[
)

MsgBox % ReadINI("S1")
MsgBox % ReadINI("S2")
MsgBox % ReadINI("S3")
MsgBox % ReadINI("S4")
MsgBox % ReadINI("S5")
return

ReadINI(Section)
{
    global INI
    pattern := "(^|.*\R)"         ; либо в начале текста, либо после знака переноса строки
             . "\[" Section "]"   ; название секции в квадратных скобках
             . "\R(.*?)"          ; всё после знака переноса строки вплоть до ближайшего
             . "(\R\[.*|$)"       ; знака переноса стоки перед квадратной скобкой, либо до конца текста
             
    return RegExReplace(INI, pattern, "$2")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Regexreplace, чтение секции файла INI

Спасибо.
Почему в этой строке перед второй скобкой не надо ставить слэш? Потому что первая считается открытием класса символов (если ее не экранировать), а вторая просто символом?

 . "\[" Section "]"

Забыл еще про тот случай, когда ключом является [. Это сделал сам.

INI=
(
[S1]
key1=value1[S3]
key2=value2
[S2]
key3=value3
key4=value4[[
[S3]
key5=value5]]
key6=value6[S3]
[S4]
]=value7][
[=value8[s5]
[S5]
[=value9]
key10=value10[
)

MsgBox % ReadINI("S1")
MsgBox % ReadINI("S2")
MsgBox % ReadINI("S3")
MsgBox % ReadINI("S4")
MsgBox % ReadINI("S5")
return

ReadINI(Section)
{
    global INI
    pattern := "(^|.*\R)"         ; либо в начале текста, либо после знака переноса строки
             . "\[" Section "]"   ; название секции в квадратных скобках
             . "\R(.*?)"          ; всё после знака переноса строки вплоть до ближайшего
             . "(\R\[[^=].*|$)"       ; знака переноса стоки перед квадратной скобкой, либо до конца текста
             
    return RegExReplace(INI, pattern, "$2")
}

4

Re: AHK: Regexreplace, чтение секции файла INI

InFlames пишет:

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

Дык ведь, перед которыми надо, перечислены в хелпе: \.*?+[{|()^$. Хотя, возможен случай, когда нужно экранировать и закрывающую скобку, если она будет находиться внутри перечня, как символ.

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

5 (изменено: DD, 2019-08-12 05:32:25)

Re: AHK: Regexreplace, чтение секции файла INI

Дано ли такой командой прочитать из секции предпоследний ключ, количество которых меняется?

IniRead, OutputVar, file.ini, RememberFiles, 195
MsgBox, %OutputVar%

6

Re: AHK: Regexreplace, чтение секции файла INI

Иначе говоря, в команде IniRead предусмотрено чтение из секции последнего/предпоследнего ключа с меняющимся номером, вместо названия (так как их количество плавающее)?

7

Re: AHK: Regexreplace, чтение секции файла INI

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

8

Re: AHK: Regexreplace, чтение секции файла INI

Странно, ведь в INI обычное дело, когда ключи нумерованные, с меняющимся количеством. Значит, недоработка команды, раз нельзя прочитать последний ключ без определенного названия из секции с определенным названием. Тогда уж проще сразу регулярку применить.

9 (изменено: teadrinker, 2019-08-13 20:38:18)

Re: AHK: Regexreplace, чтение секции файла INI

ypppu пишет:

Не, нельзя узнать сколько ключей в разделе и сколько разделов в ini-файле стандартной командой.

ypppu, нужно же хотя бы иногда в справку заглядывать!

iniPath := A_ScriptDir . "\options.ini"
x := 100, y := 200, w := 300, h := 250

for k, v in ["x", "y", "w", "h"]
   IniWrite, % %v%, % iniPath, Coords, %v%

IniRead, Section, % iniPath, Coords
IniRead, SectionNames, % iniPath

MsgBox,, Coords Section, % Section
MsgBox,, Existing Sections, % SectionNames
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Regexreplace, чтение секции файла INI

А где здесь показано сколько ключей в разделе?

11

Re: AHK: Regexreplace, чтение секции файла INI

В первом сообщении все ключи из раздела. Как посчитать, надо подсказывать?

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

12

Re: AHK: Regexreplace, чтение секции файла INI

Тогда это будет уже не стандартная команда, а нестандартная команда.
Стандартной же команды для подсчета количества ключей и разделов нет.

13

Re: AHK: Regexreplace, чтение секции файла INI

Да, это проблема.

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

14

Re: AHK: Regexreplace, чтение секции файла INI

Стандартная команда для подсчёта кол-ва строк не помешала бы.

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

15

Re: AHK: Regexreplace, чтение секции файла INI

А зачем может понадобиться знать количество строк?

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

16

Re: AHK: Regexreplace, чтение секции файла INI

Нет смысла усложнять ini-команды, в то время как есть объект. Просто надо считать array.Length(), как-то так, точно не помню.

17 (изменено: serzh82saratov, 2019-08-13 22:27:29)

Re: AHK: Regexreplace, чтение секции файла INI

teadrinker пишет:

А зачем может понадобиться знать количество строк?

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

StrSplit(Section, "`n").Count()
ypppu пишет:

Нет смысла усложнять ini-команды, в то время как есть объект.

А что за объект?

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

18

Re: AHK: Regexreplace, чтение секции файла INI

serzh82saratov пишет:

Например в этом случае.

Зачем? Вопрос был:

DD пишет:

Дано ли такой командой прочитать из секции предпоследний ключ, количество которых меняется?

Чтобы прочитать предпоследнюю строку из списка, не надо знать количество строк.

serzh82saratov пишет:

А тебе никогда это не требовалось?

Мне никогда. Подозреваю, это могло бы понадобиться в случае какого-либо нестандартного использования ini-файла.

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

19

Re: AHK: Regexreplace, чтение секции файла INI

teadrinker пишет:

Зачем? Вопрос был

Ну это смотря кто про что:

ypppu пишет:

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

teadrinker пишет:

Чтобы прочитать предпоследнюю строку из списка, не надо знать количество строк.

Ты про Regex, можно, но StrSplit будет нагляднее и проще править для новичка.

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

20

Re: AHK: Regexreplace, чтение секции файла INI

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

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

21

Re: AHK: Regexreplace, чтение секции файла INI

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

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

22

Re: AHK: Regexreplace, чтение секции файла INI

serzh82saratov пишет:
ypppu пишет:

Нет смысла усложнять ini-команды, в то время как есть объект.

А что за объект?

Object
AutoHotkey's basic object datatype is an associative array with features which allow its behaviour to be customized.
Там же уже есть встроенные MinIndex / MaxIndex / Length / Count. Если кодеру недостаточно возможностей ini-команд, значит нужно использовать объект в качестве инструмента упорядочения данных. По-моему это проще, чем танцы с бубном вокруг ini.

23

Re: AHK: Regexreplace, чтение секции файла INI

В PotPlayer, например, так —


[RememberFiles]
0=E:\youtube_dl\Концерт Гос. ак. симф. оркестра СССР. Д-р Е.Светланов (1985).cNY5AI0_a44.mkv
1=D:\(TheDoors\The Doors - 30th Anniversary Collection\vol 1.avi
2=

24

Re: AHK: Regexreplace, чтение секции файла INI

А, ну если речь идёт не о своём ini, тогда может понадобиться. Для своего можно сделать более удобную конфигурацию.

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

25

Re: AHK: Regexreplace, чтение секции файла INI

Какую?

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

26

Re: AHK: Regexreplace, чтение секции файла INI

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

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