Hallo Community,
ich beschäftige mich zurzeit mit RegEx. Nun schwebt mir vor, ein AutoIt-RegEx-Tester zu erstellen. Damit kann ich verschiedene Szenarien üben und dies dann vielleicht auch anderen sinnvoll weitergeben / beibringen.
Inhalt:
Ein Beispieltext in RichEdit ist vorhanden. Sowie ein Inputfeld für den Regulären Ausdruck, der versucht werden soll. Ein Button zur Ausführung und schon sollen die Treffer im Text des RichEdits entsprechend markiert (ge'highlight'et) werden. So viel zur Vorstellung.
Die bisherige Lösung:
Spoiler anzeigen
#region includes
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>
#endregion
#region init
$sPre = "{\rtf1"
$sText = "Hier steht nun ein entsprechender TEST-Text, welcher ein Mini-Highlighting durch RegEx ermöglichen soll. Dabei sind die folgenden Zahlen- bzw. /Ziffernfolgen einfach nur zum Test oder auch üben da. Es dreht sich um den 04.04.2014 (2014-04-04 als Alternativschreibweise). Ein Problem stellt sich mir, bei der Ersetzung!"
$sSuf = "}"
#endregion
#region GUI
$hGui = GUICreate( "RegEx-Tester", 700, 450, Default, Default )
$hRichEdit = _GUICtrlRichEdit_Create( $hGui, $sPre & $sText & $sSuf, 10, 10, 680, 350, BitOR( $ES_MULTILINE, $ES_READONLY ), $WS_EX_TRANSPARENT )
$iInput = GUICtrlCreateInput( "", 10, 355, 670, 35 )
GUICtrlSetFont( -1, 18 )
$oBtn = GUICtrlCreateButton( "Any matches?", 10, 405, 670, 35 )
GUICtrlSetFont( -1, 18 )
GUISetState()
#endregion
#region events (while)
While 1
$eMsg = GUIGetMsg()
Switch $eMsg
Case $GUI_EVENT_CLOSE
GUIDelete()
Exit
Case $oBtn
_getMatches()
EndSwitch
WEnd
#endregion
#region functions
Func _reset()
; reset
$sPre = "{\rtf1"
$sText = "Hier steht nun ein entsprechender TEST-Text, welcher ein Mini-Highlighting durch RegEx ermöglichen soll. Dabei sind die folgenden Zahlen- bzw. /Ziffernfolgen einfach nur zum Test oder auch üben da. Es dreht sich um den 04.04.2014 (2014-04-04 als Alternativschreibweise). Ein Problem stellt sich mir, bei der Ersetzung!"
$sSuf = "}"
; set the reset text
_GUICtrlRichEdit_SetText( $hRichEdit, $sPre & $sText & $sSuf )
EndFunc
Func _getMatches()
; first reset the RichEdit
_reset()
; read the RegEx input
$sInput = GUICtrlRead( $iInput )
If $sInput = "" Then Return
; get a RegExRes (result)
$aRegExRes = StringRegExp( $sText, $sInput, 3 )
_ArrayDisplay( $aRegExRes ) ; ### debugging
; do the replacing
$iCount = UBound( $aRegExRes ) - 1
If IsArray( $aRegExRes ) <> 0 Then
For $i = 0 To $iCount Step 1
$sRegEx = StringRegExpReplace( $sText, $sInput, '{\\b ' & $aRegExRes[$i] & '}', 1 )
MsgBox( "", $i, $sPre & $sRegEx & $sSuf ) ; ### debugging
_GUICtrlRichEdit_SetText( $hRichEdit, $sPre & $sRegEx & $sSuf )
Next
EndIf
EndFunc
#endregion
Der Ausdruck [Tüx] bringt mir bspw. im Array $aRegExRes 7 Treffer. Jedoch wird immer die erste Stelle, der erste Treffer ersetzt. Dies eben mit den Varianten im Array. Nun möchte ich jedoch, dass bei 7 Treffern, auch 7 Stellen mit den richtigen Werten ersetzt werden. Warum die Treffer so nicht gleichmäßig ersetzt werden können, ist mir klar, aber mir fehlt die Lösungsstrategie. Ich weiß nicht, wie ich dies sinnvoll umsetzen könnte.
Hinweis:
Für das "highlighting" nutze ich die Eigenschaften des RichEdits bzw. von RTF. Dabei setze ich vor den Treffer eindach {\b und danach wieder } .
Ich bin über jede Idee, Verbesserung oder einen Ansatz dankbar. In diesem Sinne, einen angenehmen Tag noch.
UserIsGrateful 【ツ】