Что нового

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

CreatoR

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

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

Код:
$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
 
Сообщения
119
Репутация
-6
Баг подтверждаю.

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 444
Репутация
2 394
ЭйчЭйч [?]
Баг подтверждаю.
Ну как бы мне нужно решение а не подтверждение :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 254
Репутация
552
OffTopic:
CreatoR, не обращай внимание. Ребенок играется :smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 444
Репутация
2 394
Автор
CreatoR

CreatoR

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

xXx

Меценат
Меценат
Сообщения
171
Репутация
55
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 444
Репутация
2 394
xXx
Версия №2 у тебя неверное использование. Там кавычки нужно указывать в последовательности от обратного: '"[(|)]"'

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

CreatoR

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

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 444
Репутация
2 394
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

Меценат
Меценат
Сообщения
171
Репутация
55
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 444
Репутация
2 394
xXx [?]
А вот это что: '"[(|)]"'
Всё что до | это открывающие кавычки, после - закрывающие.

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

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

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

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

CreatoR

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