Что нового

[RegExp] Получить массив не закомментированных строк #Include

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Как в одном действии получить массив объявлений файлов #Include.
В 2-х действиях выполняю так :
Код:
#Include<Array.au3>

$sText = "#include <GuiConstantsEx.au3>"  & @CRLF & _ 
"#include ' StaticConstants.au3 '"  & @CRLF & _ 
"#Include ' GUIListView.au3 '"  & @CRLF & _ 
""  & @CRLF & _ 
"#cs"  & @CRLF & _ 
"#include <IE.au3>"  & @CRLF & _ 
"#Include <String.au3>"  & @CRLF & _ 
""  & @CRLF & _ 
"#ce"  & @CRLF & _ 
""  & @CRLF & _ 
"#include < File.au3 >"  & @CRLF & _ 
""  & @CRLF & _ 
"#comments-start"  & @CRLF & _ 
"#include <1.au3>"  & @CRLF & _ 
"#Include <2.au3>"  & @CRLF & _ 
""  & @CRLF & _ 
"#comments-end"  & @CRLF & _ 
""  & @CRLF & _ 
"Global X"  & @CRLF & _ 
"'..........'"

$sPatern = "(?si)#(cs|comments-start).*?#(ce|comments-end)"
$sText=StringRegExpReplace( $sText, $sPatern, '' )
ConsoleWrite ("$sText = " &$sText & @LF)

$sPatern = "(?si)\n\t*(#Include\W*.+?\.au3)"
$aResult = StringRegExp(@LF & $sText, $sPatern, 3 )
_ArrayDisplay($aResult, ' Test Result ')
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Re: [RegExp] Получить массив не закомментированных строк (#Include)

Код:
$sText=StringRegExpReplace( $sText, "(?si)#(cs|comments-start).*?#(ce|comments-end)", '' )

Или я чтото не понял?
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: [RegExp] Получить массив не закомментированных строк (#Include)

Так ведь это тоже закомментированные строки :
Код:
#cs
#include <IE.au3>
#Include <String.au3>

#ce

#cs
#include <1.au3>
#Include <2.au3>
#ce


Наверное так нагляднее будет:

Код:
#include <GuiConstantsEx.au3>
#include " StaticConstants.au3 "
;#Include ' GUITreeView.au3 '
#Include ' GUIListView.au3 '

#cs
#include <IE.au3>
#Include <String.au3>

#ce

#include < File.au3 >

#comments-start
#include <1.au3>
#Include <2.au3>

#comments-end

Global $X
".........."





Добавлено:
Сообщение автоматически объединено:

Видимо мне на Новый Год надо заниматься другими вещами :laugh:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Код:
$sPatern = "(?si)(?:#(?:cs|comments-start).*?#(?:ce|comments-end).*?)*\n\t*(#include.+?\.au3|$)"
$aResult = StringRegExp(@LF & $sText & @LF, $sPatern, 3 )
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
И в результате ларчик так просто открылся. Надо же. :smile: :(
dwerf
спасибо :beer:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
gregaz [?]
И в результате ларчик так просто открылся.
Без костыля с последним символом и пустой ячейкой в массиве у меня так ничего и не вышло.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
dwerf [?]
Без костыля с последним символом и пустой ячейкой в массиве у меня так ничего и не вышло.

Ха-ха. А я то пытаюсь избавиться от пустой ячейки. :laugh:
Не все так просто, как кажется на первый взгляд.
Вообщем пустая ячейка - это не принципиально.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Код:
$sPatern = "(?si)(?:#(?:cs|comments-start).*?#(?:ce|comments-end).*?)*\n\t*(#include.+?\.au3)"
$aResult = StringRegExp(@LF & $sText & @LF, $sPatern, 3 )

Так будет без пустой ячейки, но если после последнего комментария не будет ещё хотя бы одного #include, то содержимое этого комментария попадёт в массив.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
dwerf [?]
Так будет без пустой ячейки, но если после последнего комментария не будет ещё хотя бы одного #include, то содержимое этого комментария попадёт в массив.

Да, я это уже заметил. :(
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
Код:
$aResult = StringRegExp(@LF & StringRegExpReplace( $sText, "(?si)#(cs|comments-start).*?#(ce|comments-end)", '' ), "(?si)\n\t*(#Include\W*.+?\.au3)", 3 )


При проверке в цикле (100 итераций) при использовании реального файла "WinAPI.au3" вариант dwerf проиграл вдвое по времени. Не вижу чем двойная функция хуже одинарной... лишние переменные не плодит.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
Не вижу чем двойная функция хуже одинарной... лишние переменные не плодит.

В принципе я давно замечаю,что конструкция (...|...) сильно тормозит процесс.
Видимо в варианте от dwerf именно костыль с "|$" влияет на скорость.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
Любая вариация тормозит, но в одних случаях это разовая запрос от пользователя, который не заметит сотню таких регулярных выражений между нажатиями кнопок, другой вариант обработка в цикле сотню файлов. В функции _FileSearch я принудительно вставлял символ, чтобы ускорить регулярку. Когда она ищет последний "\" в пути к файлу, то спотыкается на каждом и проверяет нет ли впереди ещё. Если вставить разделитель | и искать до него, то рабтает в 2 раза быстрее, а для общего времени это сказывается 5 сек против 10 сек, а удалить потом разделитель оказалось мгновенно. И последнее время я по возможности использую строковые функции.
 
Верх