Войти

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


Creat0R
23-08-2009, 02:36
#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
Creat0R, пара паттернов, но в параметрах не должно быть квадратных скобок:
'\[[^]]+\][^[]+', '(?m)^\[[^]]+\][^[]+[^[\n\r]'

Creat0R
23-08-2009, 16:01
в параметрах не должно быть квадратных скобок »
А вот это проблема, они как раз могуь встречаться. А нельзя задать поиск квадратных скобок по паре, плюс чтобы открывающая скобка была найдена только в начале строки?

SyDr
23-08-2009, 17:31
Вопрос: а обязательно именно регулярными выражениями это делать?

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

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

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

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

amel27
27-08-2009, 07:22
Creat0R, решено?

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

amel27
28-08-2009, 07:04
Нужно просто удалить целиком одну секцию (например [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
например, так »
Спасибо, то что нужно, а я как раз пришёл к другому, менее красивому (и наверное уступающему по скорости обработки) решению:

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

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

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




© OSzone.net 2001-2012