Hi Community,
vorhin musste ich für ein Skript herausfinden, an welcher Position sich in einem String eine Expression aus einem regulären Ausdruck befindet. So habe ich mir die Funktion _StringRegExPos() geschrieben.
Die Funktion gibt ein 2D-Array zurück, indem Index-0 die RegExp. ist und Index-1 die Position. Das Errorhandling ist das Gleiche wie bei StringRegEx.
[autoit]
Func _StringRegExPos($string, $pattern, $flag = 0, $offset = 1)
Local $ar_regEx = StringRegExp($string, $pattern, $flag, $offset)
If @error Then
SetError(@error, @extended)
Else
Local $s = $string, $hp = 0, $ar_pos[1][2]
For $i = 0 To UBound($ar_regEx) - 1
ReDim $ar_pos[$i + 1][2]
$p = StringInStr($s, $ar_regEx[$i], 1, 1)
$l = StringLen($ar_regEx[$i])
$s = StringTrimLeft($s, ($p - 1) + $l)
$ar_pos[$i][1] = $hp + $p
If $l < 1 Then $ar_pos[$i][1] += $l - 1
$ar_pos[$i][0] = $ar_regEx[$i]
$hp += ($p - 1) + $l
Next
Return $ar_pos
EndIf
EndFunc ;==>_StringRegExPos
Beispiel:
Spoiler anzeigen
#include <Array.au3>
$regEx = _StringRegExPos('A1B2C3D4E5F6G7H8I9J0', '\d', 3)
If @error Then MsgBox(16,"Caution","_StringRegExPos failed:" & @CRLF & "@error: " & @error)
_ArrayDisplay($regEx)
[/autoit] [autoit][/autoit] [autoit]Func _StringRegExPos($string, $pattern, $flag = 0, $offset = 1)
Local $ar_regEx = StringRegExp($string, $pattern, $flag, $offset)
If @error Then
SetError(@error, @extended)
Else
Local $s = $string, $hp = 0, $ar_pos[1][2]
For $i = 0 To UBound($ar_regEx) - 1
ReDim $ar_pos[$i + 1][2]
$p = StringInStr($s, $ar_regEx[$i], 1, 1)
$l = StringLen($ar_regEx[$i])
$s = StringTrimLeft($s, ($p - 1) + $l)
$ar_pos[$i][1] = $hp + $p
If $l < 1 Then $ar_pos[$i][1] += $l - 1
$ar_pos[$i][0] = $ar_regEx[$i]
$hp += ($p - 1) + $l
Next
Return $ar_pos
EndIf
EndFunc ;==>_StringRegExPos
Die Funktion ist "recht" schnell. Der Durchschnittswert von 100.000 Durchläufen mit obigem Skript beträgt 0.00033 Sekunden.