Im Grunde ist das nix großes - daher keine extra UDF hierfür.
Worum geht es?: Mit StringRegExp können wir uns die Teile eines Strings zurückgeben, welche einem bestimmten Muster entsprechen. In anderen Sprachen gibt es jedoch noch einen weiteren Ansatz:
Dort kann man Strings anhand von Trennstrings trennen, deren Muster sich aus einem regulären Ausdruck ergibt.
Das kann je nach Anwendungsfall einfacher sein als sich ein Muster zu überlegen welches alles andere definiert.
Im Prinzip funktioniert es wie StringSplit - nur dass man anstatt einem Trennstring eben ein Trenn-Pattern angibt.
Hierfür dient nun folgende Funktion (kann sein dass soetwas schonmal ein anderer gemacht hat):
#include <Array.au3>
$sString = "Hello:world:foo://:bar"
$sPattern = ':(?!\/\/)'
$aSplit = _regex_split($sString, $sPattern)
_ArrayDisplay($aSplit)
; #FUNCTION# ====================================================================================================================
; Name ..........: _regex_split
; Description ...: separates a string of separators described by a regular expression.
; The separators are not part of the result strings.
; Syntax ........: _regex_split($sString, $sSplitPattern)
; Parameters ....: $sString - string, which should be split
; $sSplitPattern - regular expression which defines the separation pattern.
; Return values .: 1D-Array containing the substrings split based on the separators.
; Author ........: AspirinJunkie
; Modified ......: 2023-03-06
; Example .......: $aSplit = _regex_split("Hello:world:foo://:bar", ':(?!\/\/)')
; ===============================================================================================================================
Func _regex_split($sString, $sSplitPattern)
; map to be able to add elements dynamically
Local $mSubStrings[]
Local $aCut, $iOffset = 1, $iStart, $nLen
Do
; find next separator
$aCut = StringRegExp($sString, $sSplitPattern, 1, $iOffset)
If @error Then ExitLoop
$iStart = @extended
$nLen = StringLen($aCut[0])
; append substring to result map
MapAppend($mSubStrings, StringMid($sString, $iOffset, $iStart - $iOffset - $nLen))
$iOffset = $iStart + $nLen - 1
Until @error
; prepare the return array
Local $aRet[UBound($mSubStrings) + 1]
; transfer all values from the map to the array
For $i = 0 To UBound($mSubStrings) - 1
$aRet[$i] = $mSubStrings[$i]
Next
; don't forget the part after the last separator
$aRet[UBound($aRet) - 1] = StringTrimLeft($sString, $iStart - 1)
Return $aRet
EndFunc
Alles anzeigen
Edit:
Nach etwas Überlegen ist mir ein Ansatz eingefallen, welcher wohl in allen Belangen (Codegröße, Ausführungsgeschwindigkeit, Verständlichkeit) der obige Version überlegen ist.
Ich würde daher dazu raten eher diese Funktion zu verwenden:
#include <Array.au3>
$sString = "Hello:world:foo://:bar"
$sPattern = ':(?!\/\/)'
$aSplit = _regex_split($sString, $sPattern)
_ArrayDisplay($aSplit)
; #FUNCTION# ====================================================================================================================
; Name ..........: _regex_split
; Description ...: separates a string of separators described by a regular expression.
; The separators are not part of the result strings.
; Syntax ........: _regex_split($sString, $sSplitPattern)
; Parameters ....: $sString - string, which should be split
; $sSplitPattern - regular expression which defines the separation pattern.
; $dFlag - Flag for StringSplit()
; Return values .: 1D-Array containing the substrings split based on the separators.
; Author ........: AspirinJunkie
; Modified ......: 2023-03-23
; Example .......: $aSplit = _regex_split("Hello:world:foo://:bar", ':(?!\/\/)')
; ===============================================================================================================================
Func _regex_split($sString, Const $sSplitPattern, Const $dFlag = 3)
Return StringSplit( _
StringRegExpReplace($sString, $sSplitPattern, Chr(0)), _
Chr(0), $dFlag)
EndFunc
Alles anzeigen