- Сообщения
- 8,673
- Репутация
- 2,484
Возможно кому то будет полезно, данная функция делит строку на части не учитывая кавычек или других обрамляющих символов (игнорирует содержимое в них при делении).
[ИСПРАВЛЕНО] Правда есть тут один "глюк", если в части деления есть пробел (вне кавычек), то он делит и его (вне зависимости от указанного разделителя).
Т.е вот в такой строке:
My и Item будут отдельные элементы, а нужно чтобы это было как один элемент .
Теперь есть другой "глюк":
тут bracket''s будет распознано как часть начала блока с кавычками, а должно игнорироваться...
См. Версия №2 где это исправлено
Т.е вот в такой строке:
Код:
$vTest = 'My Item, "Name, or Title"'
Теперь есть другой "глюк":
Код:
$vTest = 'My Item, "Name, or Title", ''Param, other param'', [Quoted, using square bracket''s], (Quoted, using round brackets), Icon, -2'
тут bracket''s будет распознано как часть начала блока с кавычками, а должно игнорироваться...
См. Версия №2 где это исправлено
Код:
#include <Array.au3>
$vTest = 'My Item, "Name, or Title", ''Param, other param'', [Quoted, using square brackets], (Quoted, using round brackets), Icon, -2'
$aResult = _StringSplitOutsideQuotes($vTest, ',', False, '"|''|[]|()')
_ArrayDisplay($aResult)
; #FUNCTION# ====================================================================================================================
; Name ..........: _StringSplitOutsideQuotes
; Description ...: Splits string with option to ignore quoted (or other specified framing chars) substring.
; Syntax ........: _StringSplitOutsideQuotes($sStr, $sDelim[, $fStripQuotes = True[, $sQuotes = '""|''''']])
; Parameters ....: $sStr - String to split.
; $sDelim - Delimiter to split the string.
; $fStripQuotes - [optional] If True (default), strips the quotes from splited values.
; $sQuotes - [optional] Chars that used to recognise quotes. Each char(s) should be splited with |, and can contain pair of chars (Beging char and End char). Default is ""|''.
; Return values .: Success: 1D Array with splited values, where [0] is the items count.
; Author ........: G.Sandler
; Remarks .......:
; Related .......:
; Example .......: Yes
; ===============================================================================================================================
Func _StringSplitOutsideQuotes($sString, $sDelim = ',', $fStripQuotes = True, $sQuotes = '"|''')
Local $sQtL, $sQtR, $sQtsLR, $sQtsL, $sQtsR
Local $aQts = StringSplit($sQuotes, '|')
For $i = 1 To $aQts[0]
$sQtL = StringLeft($aQts[$i], 1)
$sQtR = StringRight($aQts[$i], 1)
$sQtsLR &= '\' & $sQtL & '\' & $sQtR
$sQtsL &= '\' & $sQtL
$sQtsR &= '\' & $sQtR
Next
Local $sRE = '\G(?:\' & $sDelim & '|^)((?>[^\' & $sDelim & $sQtsLR & ']*(?:[' & $sQtsL & '][^' & $sQtsR & ']*[' & $sQtsR & '])?)+)'
Local $aSplit = StringRegExp($sString, $sRE, 3)
If @error Then
Return SetError(1, 0, 0)
EndIf
Local $aRet[UBound($aSplit) + 1] = [UBound($aSplit)]
For $i = 0 To UBound($aSplit) - 1
$aRet[$i + 1] = StringStripWS($aSplit[$i], 3)
If $fStripQuotes Then
$aRet[$i + 1] = StringRegExpReplace($aRet[$i + 1], '^[' & $sQtsL & ']+|[' & $sQtsR & ']+$', '')
EndIf
Next
Return $aRet
EndFunc
Исправлены все недочёты версии №1, но такой вариант скорее всего будет работать медленнее.
Код:
#include <Array.au3>
$vTest = 'My Item, "Name, (Title)", ''Param, [other param]'', [Quoted, using square bracket''s], (...round brackets), <...triangular brackets>, "Icon,Shell32.dll", -2'
$aResult = _StringSplitOutsideQuotes($vTest, ',', False, '''"[(<|>)]"''')
If @error Then
MsgBox(48, @ScriptName, 'Wrong $sQuotes parameter')
EndIf
_ArrayDisplay($aResult)
; #FUNCTION# ====================================================================================================================
; Name ..........: _StringSplitOutsideQuotes
; Description ...: Splits string with option to ignore quoted (or other specified framing chars) substring.
; Syntax ........: _StringSplitOutsideQuotes($sStr, $sDelim[, $fStripQuotes = True[, $sQuotes = '''"|"''']])
; Parameters ....: $sStr - String to split.
; $sDelim - Delimiter to split the string.
; $fStripQuotes - [optional] If True (default), strips the quotes from splited values.
; $sQuotes - [optional] Quote chars that used to recognise quotes. Chars should be used as pairs delimited with |, where each pair includes start|end chars, they must be in the same reverse order.
; Return values .: Success: 1D Array with splited values, where [0] is the items count.
; Author ........: G.Sandler
; Remarks .......: Example for non standard quotes in $sQuotes parameter: <"|"> - will match <String> and "String" ignoring $sDelim inside.
; Related .......:
; Example .......: Yes
; ===============================================================================================================================
Func _StringSplitOutsideQuotes($sString, $sDelim = ',', $fStripQuotes = True, $sQuotes = '"''|''"')
Local $iPos, $sRes, $iC, $fIsQuote
Local $aQuotes = StringSplit($sQuotes, '|')
Local $iQLen = StringLen($aQuotes[1])
If $aQuotes[0] < 2 Or $iQLen <> StringLen($aQuotes[2]) Then
Return SetError(1, 0, 0)
EndIf
Local $aSplit = StringSplit($sString, '')
Local $aRet[$aSplit[0]]
For $i = 1 To $aSplit[0]
If Not $fIsQuote Then
$iPos = StringInStr($aQuotes[1], $aSplit[$i], 2)
If $iPos Then
$fIsQuote = True
$sRes &= (Not $fStripQuotes ? $aSplit[$i] : '')
ContinueLoop
EndIf
EndIf
If $i = $aSplit[0] Or ($aSplit[$i] = $sDelim And Not $fIsQuote) Then
$iC += 1
$aRet[$iC] = StringStripWS($sRes & (($i = $aSplit[0] And $aSplit[$i] <> $sDelim) ? $aSplit[$i] : ''), 3)
$sRes = ''
If $i = $aSplit[0] And $aSplit[$i] = $sDelim Then
$iC += 1
$aRet[$iC] = ''
EndIf
Else
If $fIsQuote Then
If (($iQLen + 1 - StringInStr($aQuotes[2], $aSplit[$i], 2)) = $iPos) Then
$fIsQuote = False
If $fStripQuotes Then
ContinueLoop
EndIf
EndIf
EndIf
$sRes &= $aSplit[$i]
EndIf
Next
$aRet[0] = $iC
ReDim $aRet[$iC + 1]
Return $aRet
EndFunc