Что нового

StringSplitOutsideQuotes - Деление строки на части не учитывая кавычек

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Возможно кому то будет полезно, данная функция делит строку на части не учитывая кавычек или других обрамляющих символов (игнорирует содержимое в них при делении).

[ИСПРАВЛЕНО] Правда есть тут один "глюк", если в части деления есть пробел (вне кавычек), то он делит и его (вне зависимости от указанного разделителя).
Т.е вот в такой строке:

Код:
$vTest = 'My Item, "Name, or Title"'

My и Item будут отдельные элементы, а нужно чтобы это было как один элемент :scratch:.

Теперь есть другой "глюк":
Код:
$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
 
Сообщения
142
Репутация
-3
Баг подтверждаю.

Код:
My 
Item
"Name, or Title"
''Param, other param''
[Quoted, using square brackets]
(Quoted, using round brackets)
Icon
-2
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
ЭйчЭйч [?]
Баг подтверждаю.
Ну как бы мне нужно решение а не подтверждение :laugh:.
Я знаю что баг есть, я же и написал эту функцию, просто не получилось её допилить до совершенства.
У меня есть уже другой аналог, где всё нормально работает, но она медленнее:

Код:
#include <Array.au3>

$sStr = 'First param, Second, "And some other params, that includes comma as separator in quoted param", and some more'
$aSplit = _StringSplitIgnoreQuoted($sStr, ',', False)
_ArrayDisplay($aSplit)

Func _StringSplitIgnoreQuoted($sStr, $sDelim, $bStripQuotes = True)
	Local $aQuote1, $aQuote2, $aQuotes, $aQMarkers[1], $aSplit, $aRet[1], $sRet
	
	$aQuote1 = StringRegExp('0' & $sStr, '(^0|"[^"]+")', 3)
	$aQuote2 = StringRegExp('0' & $sStr, "(^0|'[^']+')", 3)
	
	_ArrayConcatenate($aQuote1, $aQuote2, 1)
	
	$aQuotes = $aQuote1
	$aQuotes[0] = UBound($aQuotes) - 1
	
	For $i = 1 To $aQuotes[0]
		$aQMarkers[0] += 1
		ReDim $aQMarkers[$aQMarkers[0] + 1]
		$aQMarkers[$aQMarkers[0]] = 'QUOTES'
		
		While StringInStr($sStr, $aQMarkers[$aQMarkers[0]], 2)
			$aQMarkers[$aQMarkers[0]] &= Random(10000, 99999)
		WEnd
		
		$sStr = StringReplace($sStr, $aQuotes[$i], $aQMarkers[$aQMarkers[0]], 1, 1)
	Next
	
	$aSplit = StringSplit($sStr, $sDelim)
	
	For $i = 1 To $aSplit[0]
		$aSplit[$i] = StringStripWS($aSplit[$i], 3)
		$sRet = $aSplit[$i]
		
		For $j = 1 To $aQMarkers[0]
			If $aSplit[$i] == $aQMarkers[$j] Then
				$sRet = ($bStripQuotes ? StringRegExpReplace($aQuotes[$j], '^["'']+|["'']+$', '') : $aQuotes[$j])
				ExitLoop
			EndIf
		Next
		
		$aRet[0] += 1
		ReDim $aRet[$aRet[0] + 1]
		$aRet[$aRet[0]] = $sRet
	Next
	
	Return $aRet
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
OffTopic:
CreatoR, не обращай внимание. Ребенок играется :smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Обновил первое сообщение.
Добавлена вторая версия где исправлены все(?) недочёты, но она работает с символами, т.е проходит каждый символ отдельно, что может сказаться на скорости обработки.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
CreatoR
- Попробуйте в параметр $sQuotes подставить пустую строку
- Попробуйте в качестве разделителя $sDelim использовать какие-нибудь другие знаки (я попробовал "]", "\", ",$", "m" - дальше уже не стал).

Попробую предложить свой вариант:
Код:
#include <Array.au3>
$sTest = 'Item, "Name)", Title, ''Param, other param '' ,$\[-rrr"rrrr"rr-]\, (Quoted, using round brackets), Icon",,,'
;$sTest = 'Item, "Name "New""'

$aResult = _StringSplitOutsideQuotes_v1_by_CreatoR($sTest, ',', False, '''|"|()|[]')
_ArrayDisplay($aResult) ; <<<<<<<<<<<<<<<<<<<<<<<< П Р О В Е Р К А >>>>>>>>>>>>>>>>>>>>>>>>

$aResult = _StringSplitOutsideQuotes_v2_by_CreatoR($sTest, ',', False, '[("''|''")]')
_ArrayDisplay($aResult) ; <<<<<<<<<<<<<<<<<<<<<<<< П Р О В Е Р К А >>>>>>>>>>>>>>>>>>>>>>>>

$aResult = _StringSplitOutsideQuotes_by_xXx($sTest, ',', False, '''|"|()|[]')
_ArrayDisplay($aResult) ; <<<<<<<<<<<<<<<<<<<<<<<< П Р О В Е Р К А >>>>>>>>>>>>>>>>>>>>>>>>

#Region ------------ F U N C T I O N S ---------------------------------------------------
Func _StringSplitOutsideQuotes_by_xXx($sString, $sDelim = ',', $bStripQuotes = True, $sQuotes = '', $iFlag = 0) ; Добавлен $iFlag для StringSplit()
	Local $aRet, $aQuotes, $sQuotesL, $sQuotesR, $sPatt, $sRS = Chr(30)
	If Not $sQuotes Then $sQuotes = '"|'''
	If $iFlag Then $iFlag = 2

	Local $aQuotes = StringSplit($sQuotes, '|')
	For $i = 1 To $aQuotes[0]
		$sQuotesL = StringLeft($aQuotes[$i], 1)
		$sQuotesR = StringRight($aQuotes[$i], 1)
		$sPatt &= '(?=\' & $sQuotesL & ').*?\' & $sQuotesR & '|'
	Next

	$sString = StringTrimRight(StringRegExpReplace($sString & $sDelim, _
			'(' & $sPatt & '.*?)\h*(?:' & StringRegExpReplace($sDelim, '([^\w\s])', '\\$1') & '\h*)', '$1' & $sRS), 1)

	$aRet = StringSplit($sString, $sRS, $iFlag)
	If Not @error And $bStripQuotes Then
		For $i = 1 To UBound($aRet) - 1
			For $j = 1 To $aQuotes[0]
				$aRet[$i] = StringRegExpReplace($aRet[$i], '^\' & StringLeft($aQuotes[$j], 1) & '(.*)\' & StringRight($aQuotes[$j], 1) & '$', '$1')
				If @extended Then ContinueLoop 2
			Next
		Next
	EndIf
	Return SetError(@error, 0, $aRet)
EndFunc   ;==>_StringSplitOutsideQuotes_by_xXx

Func _StringSplitOutsideQuotes_v1_by_CreatoR($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   ;==>_StringSplitOutsideQuotes_v1_by_CreatoR

Func _StringSplitOutsideQuotes_v2_by_CreatoR($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   ;==>_StringSplitOutsideQuotes_v2_by_CreatoR
#EndRegion ------------ F U N C T I O N S ---------------------------------------------------

Он тоже не лишен недостатков, но их можно отправить на откуп пользователям.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
xXx
Версия №2 у тебя неверное использование. Там кавычки нужно указывать в последовательности от обратного: '"[(|)]"'

Icon",,, вообще неправильно, это указано как кавычка, значит всё что после должно интерпретироваться как содержимое в кавычках, до закрывающей кавычки.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
xXx [?]
Попробуйте в параметр $sQuotes подставить пустую строку
Ну всё верно, ничего не вернёт, а что должно быть?

Попробуйте в качестве разделителя $sDelim использовать какие-нибудь другие знаки
Нужно просто дописать в описание функции что нельзя использовать в качестве разделителя тот же символ что указан в качестве кавычки.
Это и логично, ведь не может быть пары кавычки внутри этой самой кавычки.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
xXx [?]
Попробую предложить свой вариант:
Сильно не тестировал, вроде неплохо, вот тест сравнения скорости (твоя версия значительно быстрее):

Код:
#include <Array.au3>

$sTest = 'My Item, "Name, (Title)", ''Param, [other param]'', [Quoted, using square bracket''s], (...round brackets), <...triangular brackets>, "Icon,Shell32.dll", -2'

_SpeedTest('test_v2_by_CreatoR', 'v2 by CreatoR Test', 10)
_SpeedTest('test_by_xXx', 'by xXx Test', 10)

Func test_v2_by_CreatoR()
	$aRet = _StringSplitOutsideQuotes_v2_by_CreatoR($sTest, ',', False, '''"[(|)]"''')
EndFunc

Func test_by_xXx()
	$aRet = _StringSplitOutsideQuotes_by_xXx($sTest, ',', False, '''|"|()|[]')
EndFunc

Func _SpeedTest($sTestFunc, $sTitle = 'Testing', $iRepeat_Test = 5)
	Local $aTests[$iRepeat_Test + 1] = [$iRepeat_Test]
	Local $iTotal_Tests = 0
	
	ConsoleWrite(StringFormat('+ Tests for "Func %s" (%s) started...\n=--------------------=\n', $sTestFunc, $sTitle))
	
	Local $iDuration_Timer = TimerInit()
	
	For $x = 1 To $iRepeat_Test
		$iTimer = TimerInit()
		
		;=== CODE TEST ====
		Call($sTestFunc)
		;=== CODE TEST ===
		
		$aTests[$x] = Round(TimerDiff($iTimer), 3)
		$iTotal_Tests += $aTests[$x]
		ConsoleWrite(StringFormat('- Test #%i: %.2f ms\n', $x, $aTests[$x]))
	Next
	
	Local $iAverage = Round($iTotal_Tests / $iRepeat_Test, 3)
	ConsoleWrite(StringFormat('======================\n! Tests average: %.2f ms\n+ Test Duration: %.2f ms\n\n', $iAverage, TimerDiff($iDuration_Timer)))
EndFunc

#Region ------------ F U N C T I O N S ---------------------------------------------------
Func _StringSplitOutsideQuotes_by_xXx($sString, $sDelim = ',', $bStripQuotes = True, $sQuotes = '', $iFlag = 0) ; Добавлен $iFlag для StringSplit()
    Local $aRet, $aQuotes, $sQuotesL, $sQuotesR, $sPatt, $sRS = Chr(30)
    If Not $sQuotes Then $sQuotes = '"|'''
    If $iFlag Then $iFlag = 2

    Local $aQuotes = StringSplit($sQuotes, '|')
    For $i = 1 To $aQuotes[0]
        $sQuotesL = StringLeft($aQuotes[$i], 1)
        $sQuotesR = StringRight($aQuotes[$i], 1)
        $sPatt &= '(?=\' & $sQuotesL & ').*?\' & $sQuotesR & '|'
    Next

    $sString = StringTrimRight(StringRegExpReplace($sString & $sDelim, _
            '(' & $sPatt & '.*?)\h*(?:' & StringRegExpReplace($sDelim, '([^\w\s])', '\\$1') & '\h*)', '$1' & $sRS), 1)

    $aRet = StringSplit($sString, $sRS, $iFlag)
    If Not @error And $bStripQuotes Then
        For $i = 1 To UBound($aRet) - 1
            For $j = 1 To $aQuotes[0]
                $aRet[$i] = StringRegExpReplace($aRet[$i], '^\' & StringLeft($aQuotes[$j], 1) & '(.*)\' & StringRight($aQuotes[$j], 1) & '$', '$1')
                If @extended Then ContinueLoop 2
            Next
        Next
    EndIf
    Return SetError(@error, 0, $aRet)
EndFunc   ;==>_StringSplitOutsideQuotes_by_xXx

Func _StringSplitOutsideQuotes_v2_by_CreatoR($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   ;==>_StringSplitOutsideQuotes_v2_by_CreatoR
#EndRegion ------------ F U N C T I O N S ---------------------------------------------------
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
CreatoR сказал(а):
... Там кавычки нужно указывать в последовательности от обратного: '"[(|)]"'
Вот тут не понял. Прошу прощения, был невнимателен. Исправил пост.

CreatoR сказал(а):
... это указано как кавычка, значит всё что после должно интерпретироваться как содержимое в кавычках, до закрывающей кавычки.
Эта строка сборище возможных ляпов юзеров. Вот так:
Код:
$sTest = 'Item, "Name), Title, ''Param, other param '' ,$\[-rrr"rrrr"rr-]\, (Quoted, using round brackets), Icon",,,'

это будет уже закрывающая кавычка.


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

CreatoR сказал(а):
... а что должно быть?
Предлагаю добавить в описание, что может и @error выскочить.

CreatoR сказал(а):
... ведь не может быть пары кавычки внутри этой самой кавычки.
Может быть и так:
Код:
$sTest = 'Item, "Name "New""'



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

CreatoR сказал(а):
... значительно быстрее):
Дело тут даже не в этом, а в том что концепция ее работы отличается от вашей.
OffTopic:
Я думаю вы эту функцию придумали в процессе работы над такими проектами как GUIDynamicMenu UDF.
Мне тоже довелось недавно придумывать нечто, что стыковало бы файл настроек со скриптом и там тоже было меню и тоже в одну строку.
Вот сейчас сижу и думаю: а правильную ли я логику выбрал чтобы парсить такие строки?
100 процентную защиту от "дурака" придумать не возможно, но нужно стремиться к этому.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
xXx [?]
А вот это что: '"[(|)]"'
Всё что до | это открывающие кавычки, после - закрывающие.

Может быть и так
Это неправильное использование, мы же не можем всё за пользователя делать, такая конструкция неверна.

Ну для моих целей это важно, я это использую для обработки большого количества таких строк.

концепция ее работы отличается от вашей
Она похожа на мою первую версию, просто другая логика.

В любом случае идеального варианта не подобрать, у каждого свои предпочтения, мы дали людям варианты, а уж они пусть выбирают что использовать :smile:.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
xXx [?]
Я думаю вы эту функцию придумали в процессе работы над такими проектами как GUIDynamicMenu UDF.
Да, там родилась эта версия (те что в первом сообщений), а первая использовалась в Au3SyntaxHighlighter, там была очень важна скорость обработки. В ней логика совершенно другая, там сначала заменяются цитаты на уникальные строки, а после разделения строки восстанавливаются.
 
Верх