Hallo,
Da der RegExbuddy leider eine zu mächtige Engine hat, habe ich mir überlegt eine sehr sehr abgespeckte Variante für AutoIt zu schreiben. Allerdings stoße ich auf ein Problem.
Spoiler anzeigen
#include <Constants.au3>
#include <EditConstants.au3>
#include <GuiToolbar.au3>
#include <RichEditConstants.au3>
#include <SendMessage.au3>
#include <ToolbarConstants.au3>
#include <Array.au3>
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>
Global $bYellow ; If False, use Blue as next Color
Global $sIniPath = @AppDataDir & "\RegExpIt\Settings.ini"
Global $idNew, $idOpen, $idSave, $idHelp
Global $sTestString = _
"In diesem Text werden durch das \w+ alle" & @CRLF & _
"zusammenhängenden Alphanumerischen Zeichen gefunden." & @CRLF & _
"Dazu zählen A-Z, a-z, aber auch 0-9"
;~ If Not FileExists($sIniPath) Then ; Ini neu schreiben.
;~ IniWrite($sIniPath, "Genral Settings", "Resolution", "800x600")
;~ EndIf
$aGUIRes = StringSplit(IniRead($sIniPath, "General Settings", "Resolution", "800x600"), "x", 2)
$hGUI = GUICreate("RegExpIt", $aGUIRes[0], $aGUIRes[1], -1, -1)
GUISetFont(12)
$hRE_RegExp = _GUICtrlRichEdit_Create($hGUI, "\w+", 10, 10, 445, 120, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_SetFont($hRE_RegExp, 12)
$hRE_Repl = _GUICtrlRichEdit_Create($hGUI, "", 460, 10, 320, 115, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_SetFont($hRE_Repl, 12)
$hRE_TestString = _GUICtrlRichEdit_Create($hGUI, $sTestString, 10, 170, 780, 200, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))
_GUICtrlRichEdit_SetFont($hRE_TestString, 12)
$hRE_Matches = _GUICtrlRichEdit_Create($hGUI, "", 10, 400, 780, 200, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))
_GUICtrlRichEdit_SetFont($hRE_Matches, 15)
GUISetState(@SW_SHOW)
$hRepl = GUICtrlCreateCheckbox("Replace", 50, 370)
$hChildGUI = GUICreate("", $aGUIRes[0] * 0.95, 40, 10, 125, $WS_POPUP, $WS_EX_MDICHILD, $hGUI)
$hToolbar = _GUICtrlToolbar_Create($hChildGUI, $TBSTYLE_TRANSPARENT)
_GUICtrlToolbar_AddBitmap($hToolbar, 1, -1, $IDB_STD_LARGE_COLOR)
_GUICtrlToolbar_AddButton($hToolbar, $idNew, $STD_FILENEW)
_GUICtrlToolbar_AddButton($hToolbar, $idOpen, $STD_FILEOPEN)
_GUICtrlToolbar_AddButton($hToolbar, $idSave, $STD_FILESAVE)
_GUICtrlToolbar_AddButtonSep($hToolbar)
_GUICtrlToolbar_AddButton($hToolbar, $idHelp, $STD_HELP)
GUISetState()
;~ GUISetBkColor(0xFF0000,$hChildGUI)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
GUIDelete($hGUI) ;GUI löschen, wegen RichEdit.
Exit
EndSwitch
If GUICtrlRead($hRepl) = 4 Then
_RichEdit_ApplyRegExp($hRE_RegExp)
_RichEdit_ApplyRegExp($hRE_TestString)
Else
_RichEdit_ApplyReplace($hRE_RegExp)
EndIf
WEnd
Func _RichEdit_ApplyReplace(ByRef $hRichEdit)
If _GUICtrlRichEdit_IsModified($hRichEdit) Then
_GUICtrlRichEdit_SetModified($hRichEdit, False)
$sString = StringRegExpReplace(_RichEdit_GetText($hRE_TestString), _RichEdit_GetText($hRE_RegExp), _RichEdit_GetText($hRE_Repl))
If Not @error Then
__RichEdit_ColorViaRegExp($hRE_TestString)
_GUICtrlRichEdit_SetText($hRE_Matches, $sString)
Else
_GUICtrlRichEdit_SetText($hRE_Matches, "")
EndIf
_GUICtrlRichEdit_SetModified($hRE_Matches, False)
EndIf
EndFunc ;==>_RichEdit_ApplyReplace
Func _RichEdit_ApplyRegExp(ByRef $hRichEdit)
If _GUICtrlRichEdit_IsModified($hRichEdit) Then
_GUICtrlRichEdit_SetModified($hRichEdit, False)
$sRegExp = _RichEdit_GetText($hRE_RegExp)
Switch $sRegExp
Case "","\b"
Return
EndSwitch
$aTmp = StringRegExp(_RichEdit_GetText($hRE_TestString),$sRegExp, 3)
If Not @error Then
_GUICtrlRichEdit_SetText($hRE_Matches, _ArrayToString($aTmp, @CRLF))
Global $bYellow = True
$aSel = _GUICtrlRichEdit_GetSel($hRichEdit) ; Get curren Cursor Pos.
__RichEdit_ColorViaRegExp($hRE_Matches)
__RichEdit_ColorViaRegExp($hRE_TestString)
_GUICtrlRichEdit_SetSel($hRichEdit, $aSel[0], $aSel[1]) ;restore Cursor Pos
Else
_GUICtrlRichEdit_SetText($hRE_Matches, "")
EndIf
EndIf
EndFunc ;==>_RichEdit_ApplyRegExp
Func _RichEdit_GetText($hWnd, $fCrToCrLf = False, $iCodePage = 0, $sReplChar = "")
If Not IsHWnd($hWnd) Then Return SetError(101, 0, "")
If Not IsBool($fCrToCrLf) Then Return SetError(102, 0, "")
If Not __GCR_IsNumeric($iCodePage) Then Return SetError(103, 0, "")
Local $iLen = _GUICtrlRichEdit_GetTextLength($hWnd, False, True) + 1
Local $sUni = ''
If $iCodePage = $CP_UNICODE Or Not $iCodePage Then $sUni = "w"
Local $tText = DllStructCreate($sUni & "char[" & $iLen & "]")
Local $tGetTextEx = DllStructCreate($tagGETTEXTEX)
DllStructSetData($tGetTextEx, "cb", DllStructGetSize($tText))
Local $iFlags = 0
If $fCrToCrLf Then $iFlags = $GT_USECRLF
DllStructSetData($tGetTextEx, "flags", $iFlags)
If $iCodePage = 0 Then $iCodePage = $CP_UNICODE
DllStructSetData($tGetTextEx, "codepage", $iCodePage)
Local $pUsedDefChar = 0, $pDefaultChar = 0
If $sReplChar <> "" Then
Local $tDefaultChar = DllStructCreate("char")
$pDefaultChar = DllStructGetPtr($tDefaultChar, 1)
DllStructSetData($tDefaultChar, 1, $sReplChar)
Local $tUsedDefChar = DllStructCreate("bool")
$pUsedDefChar = DllStructGetPtr($tUsedDefChar, 1)
EndIf
DllStructSetData($tGetTextEx, "lpDefaultChar", $pDefaultChar)
DllStructSetData($tGetTextEx, "lpbUsedDefChar", $pUsedDefChar)
Local $iRet = _SendMessage($hWnd, $EM_GETTEXTEX, DllStructGetPtr($tGetTextEx), DllStructGetPtr($tText))
If $iRet = 0 Then Return SetError(700, 0, "")
If $sReplChar <> "" Then SetExtended(DllStructGetData($tUsedDefChar, 1) <> 0)
Return DllStructGetData($tText, 1)
EndFunc ;==>_RichEdit_GetText
[/autoit] [autoit][/autoit] [autoit]Func __RichEdit_ColorViaRegExp($hRichEdit)
$aTmp = StringRegExp(_RichEdit_GetText($hRE_TestString), _RichEdit_GetText($hRE_RegExp), 3)
_GUICtrlRichEdit_SetSel($hRichEdit, 0, -1, True)
_GUICtrlRichEdit_SetCharBkColor($hRichEdit, 0xFFFFFF)
If _RichEdit_GetText($hRE_RegExp) <> "" Then
Local $sText = _RichEdit_GetText($hRichEdit), $iCounter = 0
Global $bYellow = True
If $aTmp[0] = "" Then Return SetError(@error, @extended, "")
For $i = 0 To UBound($aTmp) - 1
$bYellow = Not $bYellow
Local $iPos = StringInStr($sText, $aTmp[$i], 1) - 1
_GUICtrlRichEdit_SetSel($hRichEdit, $iPos + $iCounter, $iPos + $iCounter + StringLen($aTmp[$i]), True)
If $bYellow Then _GUICtrlRichEdit_SetCharBkColor($hRichEdit, 0xFFF000)
If Not $bYellow Then _GUICtrlRichEdit_SetCharBkColor($hRichEdit, 0x80C0FF)
$sText = StringTrimLeft($sText, $iPos + 1)
$iCounter += $iPos + 1
Next
EndIf
_GUICtrlRichEdit_SetModified($hRichEdit, False)
EndFunc ;==>__RichEdit_ColorViaRegExp
Ändert einmal bitte das \w+ in ein \ba
Es sollen nun alle a's gefunden werden, die auf eine Wortgrenze folgen (leerzeichen, Interpunktionszeichen usw).
Gefunden werden sie ja auch, aber leider falsch "bemalt".
Die Funktion __RichEdit_ColorViaRegExp() ist der übeltäter.
Momentan arbeite ich mit StringInStr, was aber (wie ihr seht) nicht sehr effektiv und fehlerfrei ist.
Gibt es da eine bessere Möglichkeit?