Что нового

Извлечь данные из конфига

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Доброго времени суток, что то я начал под вечер тупить.

Код:
addvar bool bt_debugmode 0
addvar str gui_def_server "127.0.0.1:28960"

Код:
#Include <Array.au3>

$aResult = StringRegExp( ClipGet(), '(?m)^\s*addvar (bool|str|int|dec|float) (\w+) (?(?=\")\"([^\"]+)\"|([^\\\s]*))', 3 )
_ArrayDisplay( $aResult )


7hvlJ.png

Каким образом пробирается пустота (2)?

Заранее спасибо.
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Код:
; это третьи скобки
'(?m)^\s*addvar (bool|str|int|dec|float) (\w+) (?(?=\")\"([^\"]+)\"|([^\\\s]*))'
;--------------------------------------------------------^
; если не нужны можно так заменить
'(?m)^\s*addvar (bool|str|int|dec|float) (\w+) (\"(?:[^\"]+)\"|(?:[^\\\s]*))'
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
([^\"]+)
вот эта группа ничего не находит, и поэтому пустота.
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Z_Lenar
Все бы хорошо, но кавычки в случае их присутствия возвращаться не должны.

inververs [?]
вот эта группа ничего не находит, и поэтому пустота.
Если честно - как то раньше и не сталкивался с условием Else в регулярке, можете показать пример относительно этой задачи?
 

_dron_

Знающий
Сообщения
84
Репутация
8
Код:
\s*addvar\s+(bool|str|int|dec|float)\s+(\w+)\s+[\"]{0,}([[:print:]]{1,})[\"]{0,}

0 => bool
1 => bt_debugmode
2 => 0
3 => str
4 => gui_def_server
5 => 127.0.0.1:28960"

блин у меня последняя ковычка! :mad:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
$data = StringReplace($data,'"','')
$aResult = StringSplit($data,' ' & @LF,2)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Вариант :
Код:
#Include<Array.au3>
$sText = '' & _
'addvar bool bt_debugmode 0'  & @CRLF & _ 
'addvar str gui_def_server "127.0.0.1:28960"'

$sPatern = '(?m)^\s*addvar\s+(bool|str|int|dec|float)\s+(\S+)\s+"?([^"\s]*)"?'
$aResult = StringRegExp( $sText, $sPatern, 3 )
_ArrayDisplay($aResult, ' Test Result ')
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
gregaz
Не подойдет для текста с пробелами в кавычках.
firex
Код:
'(?m)^(?>\s*addvar\s+(bool|str|int|dec|float)\s+(\w+)\s+)"?((?<=")[^"]+|[^\\\s]+)'


Я так понял у тебя через \ идут комментарии?
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
inververs, _dron_, gregaz
Кавычки созданы для захвата пробельных символов у значения(иначе - до первого пробела) :smile: Так что все ваши варианты не годятся.

Удалось добиться следующего:
Код:
#Include <Array.au3>

$aResult = StringRegExp( ClipGet(), '(?m)^\s*addvar (bool|str|int|dec|float) (\w+) ((?:\"[^\"]+|[^\s]+))', 3 )
_ArrayDisplay( $aResult )

Добился таких результатов (захват и прочее работает как надо, однако возвращает кавычки).

7iptx.png


Z_Lenar
Прямо из под носа выдернули идею преждевременной \"? и позитивным просмотром назад, спасибо :smile:

Z_Lenar [?]
Я так понял у тебя через \ идут комментарии?
Верно
 
Верх