$sLine = ' module=mod1 | | | `~!@#$%^&()№;%{},-[]_\/?<>+ AZ az АЯ ая | param1 = 1 | param2 = 2 | param3 = test=1 | 9 | key1 | | key2|key3 '
ConsoleWrite('>>>Строка: ' & $sLine & @CR)
ConsoleWrite('Имя: ' & _getParam($sLine) & @CR) ; по умолчанию получаем имя - первый не пустой блок не содержащий в себе знака равенства
ConsoleWrite('Имя: ' & _getParam($sLine, 'name') & @CR) ; можно и так
ConsoleWrite('Есть ли ключ key2: ' & _getParam($sLine, 'key2') & @CR) ; проверить присутствие ключа
ConsoleWrite('Есть ли ключ key5: ' & _getParam($sLine, 'key5') & @CR) ;
ConsoleWrite('Есть ли ключ 9: ' & _getParam($sLine, '9') & @CR)
ConsoleWrite('Параметр param2: ' & _getParam($sLine, 'param2') & @CR) ; получить параметр
ConsoleWrite('Параметр param3: ' & _getParam($sLine, 'param3') & @CR) ;
ConsoleWrite('Параметр param99: ' & _getParam($sLine, 'param99') & @CR)
; первое явно указанное имя имеет больший приоритет
$sLine = ' module=mod1 | | | name1 | name = name2 | param1 = 1 | param2 = 2 | key1 | | key2|key3 '
ConsoleWrite('>>>Строка: ' & $sLine & @CR)
ConsoleWrite('Явно указанное имя: ' & _getParam($sLine) & @CR)
; в присутствии явно указанного имени, не явно указанное считается ключом
ConsoleWrite('Есть ли ключ name1: ' & _getParam($sLine, 'name1') & @CR)
; Извлечение по порядковому номеру
ConsoleWrite('>>>Извлечение параметров по порядковому номеру' & @CR)
ConsoleWrite('5-й блок строки: ' & _getParam($sLine, 5) & @CR)
ConsoleWrite('5-й блок, игнорируя пустые: ' & _getParam($sLine, 5, 1) & @CR)
ConsoleWrite('Если блок превышен, то последний: ' & _getParam($sLine, 99) & @CR)
ConsoleWrite('4-й блок с конца строки: ' & _getParam($sLine, -4) & @CR)
ConsoleWrite('4-й блок, с конца, игнорируя пустые: ' & _getParam($sLine, -4, 1) & @CR)
ConsoleWrite('Если блок с конца превышен, то первый: ' & _getParam($sLine, -99) & @CR)
;*****************************************************************************************************
; Извлечение параметра из строки вида: name|param=1|param=2|key1|key2 ;
; Имя - первый не пустой блок без знака равенства ;
; Имя можно задать явно name=Имя, тогда любой первый блок без знака равенства будет считаться ключом ;
; Ключ - остальные не пустые блоки без знака равенства ;
; Параметр - блок вида param=val ;
;*****************************************************************************************************
Func _getParam($sParams, $sGet = 'name', $sSp = '')
Local $aKey
$aKey = StringRegExp($sParams, '(?:^|\|)\s*(?i:' & $sGet & ')\s*=\s*([^\|]*?)\s*(?:\||$)', 1) ; извлекает значение параметра
If IsArray($aKey) And $aKey[0] Then Return $aKey[0]
If $sGet = 'name' Then $aKey = StringRegExp($sParams, '(?:^|\|)\s*([^|\s][^=]+?)\s*(?:\||\z)', 1) ; извлекает имя
If IsArray($aKey) And $aKey[0] Then Return $aKey[0]
$aKey = StringRegExp($sParams, '(?:^|\|)\s*(' & $sGet & ')\s*(?:\||\z)', 0) ; определяет присутствие ключа
If $aKey Then Return 1
If IsNumber($sGet) Then ; извлечение по порядковому номеру
$sGet -= 1
If $sSp Then $sSp = '\s' ; если необходимо игнорировать пустые блоки
$aKey = StringRegExp($sParams, '([^' & $sSp & '\|].*?)\s*(?:\||\z)', 3)
If IsArray($aKey) And UBound($aKey) > 0 Then
If $sGet < -1 Then $sGet = UBound($aKey) + $sGet + 1
If $sGet < 0 Then $sGet = 0
If $sGet > UBound($aKey) - 1 Then $sGet = UBound($aKey) - 1
Return $aKey[$sGet]
EndIf
EndIf
Return 0
EndFunc ;==>_getParam