Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] StringRegExp: Получение массива где каждый элемент содержит Ini-секцию

Ответить
Настройки темы
[решено] StringRegExp: Получение массива где каждый элемент содержит Ini-секцию

Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
#include <Array.au3>

$sRead = _
    "[Sect 1]" & @CRLF & _
    "Key=Val" & @CRLF & _
    "[Sect 2]" & @CRLF & _
    "Key=Val" & @CRLF & _
    "[Sect 3]" & @CRLF & _
    "Key=Val"

;Эта строчка добавляет новую строку перед каждой секцией в $sRead, что позволяет $sPattern быть "правильным" запросом поиска
;$sRead = StringRegExpReplace($sRead, '.*(\[.*\]).*', @CRLF & '\1')

$sPattern = '(?s).*?(\[.*?\].*?)(?:(?:\r\n){2}|\[.*?\]|$)'
$aResults = StringRegExp($sRead, $sPattern, 3)

_ArrayDisplay($aResults)
Всё что требуется, так это за один заход (один вызов StringRegExp) получить массив, где каждый элемент содержит одну секцию (целиком).
Если раскоментировать строчку с дополнительным вызовом StringRegExp, то будет видно каков мне нужен результат.

P.S
Строку с Pattern:

Код: Выделить весь код
(?s).*?(\[.*?\].*?)(?:(?:\r\n){2}|\[.*?\]|$)
Я уже менял раз 100, всё что удалось так это сбор секции через одну, а не по порядку.
Дело в том что закоментированная строчка просто добавляет перевод строки (@CRLF) к имени каждой секции, в таком раскладе мой запрос работает, т.е если в ini-файле секции разделены между собой пустой строкой, то запрос актуален, а если строки нет, и секции сливаются, то мой запрос уже не работает - а нужно чтобы срабатывала вне зависимости от наличия пустых строк.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 02:36, 23-08-2009

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R, пара паттернов, но в параметрах не должно быть квадратных скобок:
'\[[^]]+\][^[]+', '(?m)^\[[^]]+\][^[]+[^[\n\r]'

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:35, 23-08-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить PM | Цитировать


Цитата amel27:
в параметрах не должно быть квадратных скобок »
А вот это проблема, они как раз могуь встречаться. А нельзя задать поиск квадратных скобок по паре, плюс чтобы открывающая скобка была найдена только в начале строки?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 16:01, 23-08-2009 | #3


Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


Вопрос: а обязательно именно регулярными выражениями это делать?

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин


Отправлено: 17:31, 23-08-2009 | #4


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Creat0R:
нельзя задать поиск квадратных скобок по паре, плюс чтобы открывающая скобка была найдена только в начале строки? »
попробуй еще так: '(?m)^\[[^]\r\n]+\].*(?:[\r\n]+[^[\r\n][^\r\n]+)*'

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:36, 23-08-2009 | #5


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить PM | Цитировать


Цитата SyDr:
а обязательно именно регулярными выражениями это делать? »
Ну если я создал эту тему, и пишу только об этом, то видимо да - Другими методами я могу сделать, мне кроме спортивного интереса ещё нужно сделать это как можно короче и быстрее.

P.S
Не нужно плиз приводить примеры без RegExp, меня интересует только с ним, точка.

Цитата amel27:
попробуй еще так »
Супер, вроде то что надо!

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 17:41, 23-08-2009 | #6


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R, решено?

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум


Отправлено: 07:22, 27-08-2009 | #7


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить PM | Цитировать


amel27,
Ещё один вопрос в том же направлении.
Нужно просто удалить целиком одну секцию (например [Sect 2]), с теми же условиями (чтобы также между секциями небыло лишних переводов строк). Прбовал подобрать по аналогии последнего шаблона, но ничего толкового не вышло - Я его если честно не понимаю до конца.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 18:26, 27-08-2009 | #8


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Creat0R:
Нужно просто удалить целиком одну секцию (например [Sect 2]), с теми же условиями »
например, так:
Код: Выделить весь код
$sRead = _
    "[Sect 1]" & @CRLF & _
    "Key=Val" & @CRLF & _
    "[Sect 2]" & @CRLF & _
    "Key=Val" & @CRLF & _
    "[Sect 3]" & @CRLF & _
    "Key=Val"

ConsoleWrite($sRead &@CRLF&"---"&@CRLF)

$sSection = "[Sect 2]"
$sPattern = '(?mi)^\Q'& $sSection &'\E[\r\n]+(?:[^[\r\n].*(?:[\r\n]+|$))*'
$sResults = StringRegExpReplace($sRead, $sPattern, "")

ConsoleWrite($sResults &@CRLF)

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:04, 28-08-2009 | #9


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить PM | Цитировать


Цитата amel27:
например, так »
Спасибо, то что нужно, а я как раз пришёл к другому, менее красивому (и наверное уступающему по скорости обработки) решению:

Код: Выделить весь код
$sSection = "\[Sect 2\]"
$sPattern = '(?ims)(.*?[\n\r]|)' & $sSection & '.*?(^\[.*?|\z)'
$sResults = StringRegExpReplace($sRead, $sPattern, '\1\2')
P.S
Я всё никак не привыкну к использованию (?m), которое задаёт другое свойство «^» и «$», поэтому «\z» заменяет конец всей строки в этом случае.

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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 07:52, 28-08-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] StringRegExp: Получение массива где каждый элемент содержит Ini-секцию

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] StringRegExp не работает? %) Freesty1er AutoIt 4 26-01-2022 09:26
Java - Элемент массива ManHack Программирование и базы данных 2 23-10-2009 10:41
Получение массива из строки с числами malev AutoIt 3 11-09-2009 00:08
.NET - [решено] Получение массива ячеек для объединения Delirium Программирование и базы данных 10 29-07-2009 06:49
Создание массива строк,где  каждая строка оканчивается null Crew Программирование и базы данных 6 22-04-2003 16:59




 
Переход