Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] StringRegExp: Получение массива где каждый элемент содержит Ini-секцию (http://forum.oszone.net/showthread.php?t=148655)

Creat0R 23-08-2009 02:36 1200848

StringRegExp: Получение массива где каждый элемент содержит Ini-секцию
 
Код:

#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-файле секции разделены между собой пустой строкой, то запрос актуален, а если строки нет, и секции сливаются, то мой запрос уже не работает - а нужно чтобы срабатывала вне зависимости от наличия пустых строк.

amel27 23-08-2009 08:35 1200899

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

Creat0R 23-08-2009 16:01 1201151

Цитата:

Цитата amel27
в параметрах не должно быть квадратных скобок »

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

SyDr 23-08-2009 17:31 1201230

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

amel27 23-08-2009 17:36 1201234

Цитата:

Цитата Creat0R
нельзя задать поиск квадратных скобок по паре, плюс чтобы открывающая скобка была найдена только в начале строки? »

попробуй еще так: '(?m)^\[[^]\r\n]+\].*(?:[\r\n]+[^[\r\n][^\r\n]+)*'

Creat0R 23-08-2009 17:41 1201243

Цитата:

Цитата SyDr
а обязательно именно регулярными выражениями это делать? »

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

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

Цитата:

Цитата amel27
попробуй еще так »

Супер, вроде то что надо!

amel27 27-08-2009 07:22 1204315

Creat0R, решено?

Creat0R 27-08-2009 18:26 1204773

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

amel27 28-08-2009 07:04 1205185

Цитата:

Цитата 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)


Creat0R 28-08-2009 07:52 1205189

Цитата:

Цитата amel27
например, так »

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

Код:

$sSection = "\[Sect 2\]"
$sPattern = '(?ims)(.*?[\n\r]|)' & $sSection & '.*?(^\[.*?|\z)'
$sResults = StringRegExpReplace($sRead, $sPattern, '\1\2')

P.S
Я всё никак не привыкну к использованию (?m), которое задаёт другое свойство «^» и «$», поэтому «\z» заменяет конец всей строки в этом случае.

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


Время: 03:49.

Время: 03:49.
© OSzone.net 2001-