Position eines RegExp-Matches herausfinden

  • 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
    [autoit]

    #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"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ 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)

    [/autoit] [autoit][/autoit] [autoit]

    $hRE_RegExp = _GUICtrlRichEdit_Create($hGUI, "\w+", 10, 10, 445, 120, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    _GUICtrlRichEdit_SetFont($hRE_RegExp, 12)

    [/autoit] [autoit][/autoit] [autoit]

    $hRE_Repl = _GUICtrlRichEdit_Create($hGUI, "", 460, 10, 320, 115, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    _GUICtrlRichEdit_SetFont($hRE_Repl, 12)

    [/autoit] [autoit][/autoit] [autoit]

    $hRE_TestString = _GUICtrlRichEdit_Create($hGUI, $sTestString, 10, 170, 780, 200, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))
    _GUICtrlRichEdit_SetFont($hRE_TestString, 12)

    [/autoit] [autoit][/autoit] [autoit]

    $hRE_Matches = _GUICtrlRichEdit_Create($hGUI, "", 10, 400, 780, 200, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))
    _GUICtrlRichEdit_SetFont($hRE_Matches, 15)

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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.

    [/autoit] [autoit][/autoit] [autoit]

    __RichEdit_ColorViaRegExp($hRE_Matches)
    __RichEdit_ColorViaRegExp($hRE_TestString)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlRichEdit_SetSel($hRichEdit, $aSel[0], $aSel[1]) ;restore Cursor Pos
    Else
    _GUICtrlRichEdit_SetText($hRE_Matches, "")
    EndIf
    EndIf
    EndFunc ;==>_RichEdit_ApplyRegExp

    [/autoit] [autoit][/autoit] [autoit]

    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, "")

    [/autoit] [autoit][/autoit] [autoit]

    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 & "]")

    [/autoit] [autoit][/autoit] [autoit]

    Local $tGetTextEx = DllStructCreate($tagGETTEXTEX)
    DllStructSetData($tGetTextEx, "cb", DllStructGetSize($tText))

    [/autoit] [autoit][/autoit] [autoit]

    Local $iFlags = 0
    If $fCrToCrLf Then $iFlags = $GT_USECRLF
    DllStructSetData($tGetTextEx, "flags", $iFlags)

    [/autoit] [autoit][/autoit] [autoit]

    If $iCodePage = 0 Then $iCodePage = $CP_UNICODE
    DllStructSetData($tGetTextEx, "codepage", $iCodePage)

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]

    Ä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?

  • Hallo SEuBo.
    Ich glaube, ich weiss wie du es machen kannst (Theoretisch)
    Schau dir mal meine StringAdvanced UDF an.
    Da ist die Funktion _String_GetCharacter() drinne.
    Ruf sie so auf.
    $len = StringLen(Name des zu bemalenden Strings)
    $char = _String_GetCharacter(Name des zu bemalenden Strings, $len)
    Und dann frag ab, ob $char a ist oder nicht.
    Beispiel:

    [autoit]

    #include "StringAdvanced.au3"

    [/autoit][autoit][/autoit][autoit]

    $str = InputBox("Text", "Gib nen Text ein")
    $len = StringLen($str)
    $char = _String_GetCharacter($str, $len)
    If $char = "a" Then
    MsgBox(0, "", "Der letzte Buchstabe ist a")
    Else
    MsgBox(0, "", "Der letzte Buchstabe ist kein a")
    EndIf

    [/autoit]

    Aber vorher musst du die StringAdvanced UDF downloaden, siehe Oben oder Signatur.
    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • *Ausbuddel*

    Der Lösungsvorschlag hat leider nicht geholfen (wir hatten das ja bereits per PM besprochen.

    Ich hab den Code mittlerweile so weit:

    Spoiler anzeigen
    [autoit]

    #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
    $sString = ""

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ 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)

    [/autoit] [autoit][/autoit] [autoit]

    $hRE_RegExp = _GUICtrlRichEdit_Create($hGUI, '', 10, 10, 445, 120, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    _GUICtrlRichEdit_SetFont($hRE_RegExp, 12)

    [/autoit] [autoit][/autoit] [autoit]

    $hRE_Repl = _GUICtrlRichEdit_Create($hGUI, "", 460, 10, 320, 115, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    _GUICtrlRichEdit_SetFont($hRE_Repl, 12)

    [/autoit] [autoit][/autoit] [autoit]

    $hRE_TestString = _GUICtrlRichEdit_Create($hGUI, $sString, 10, 170, 780, 200, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))
    _GUICtrlRichEdit_SetFont($hRE_TestString, 12)

    [/autoit] [autoit][/autoit] [autoit]

    $hRE_Matches = _GUICtrlRichEdit_Create($hGUI, "", 10, 400, 780, 200, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))
    _GUICtrlRichEdit_SetFont($hRE_Matches, 15)

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit (GUIDelete($hGUI) = 0) ;GUI löschen, wegen RichEdit.
    EndSwitch
    If GUICtrlRead($hRepl) = 4 Then
    _RichEdit_ApplyRegExp($hRE_RegExp)
    _RichEdit_ApplyRegExp($hRE_TestString)
    Else
    _RichEdit_ApplyReplace($hRE_RegExp)
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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 And IsArray($aTmp) Then
    _GUICtrlRichEdit_SetText($hRE_Matches, _ArrayToString($aTmp, @CRLF))
    Global $bYellow = True

    [/autoit] [autoit][/autoit] [autoit]

    $hFocus = __RichEdit_Hasfocus()
    $aSel = _GUICtrlRichEdit_GetSel($hFocus) ; Get curren Cursor Pos.

    [/autoit] [autoit][/autoit] [autoit]

    __RichEdit_ColorViaRegExp($hRE_Matches)
    __RichEdit_ColorViaRegExp($hRE_TestString)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlRichEdit_SetSel($hFocus, $aSel[0], $aSel[1]) ;restore Cursor Pos
    Else
    _GUICtrlRichEdit_SetText($hRE_Matches, "")
    _RichEdit_ResetHighlighting($hRE_RegExp)
    _RichEdit_ResetHighlighting($hRE_Matches)
    _RichEdit_ResetHighlighting($hRE_TestString)
    EndIf
    EndIf
    EndFunc ;==>_RichEdit_ApplyRegExp

    [/autoit] [autoit][/autoit] [autoit]

    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, "")

    [/autoit] [autoit][/autoit] [autoit]

    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 & "]")

    [/autoit] [autoit][/autoit] [autoit]

    Local $tGetTextEx = DllStructCreate($tagGETTEXTEX)
    DllStructSetData($tGetTextEx, "cb", DllStructGetSize($tText))

    [/autoit] [autoit][/autoit] [autoit]

    Local $iFlags = 0
    If $fCrToCrLf Then $iFlags = $GT_USECRLF
    DllStructSetData($tGetTextEx, "flags", $iFlags)

    [/autoit] [autoit][/autoit] [autoit]

    If $iCodePage = 0 Then $iCodePage = $CP_UNICODE
    DllStructSetData($tGetTextEx, "codepage", $iCodePage)

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func __RichEdit_Hasfocus()
    $iRet = ControlGetHandle($hGUI, "", ControlGetFocus($hGUI))
    If Not @error Then Return $iRet
    Return 0
    EndFunc ;==>__RichEdit_Hasfocus

    [/autoit] [autoit][/autoit] [autoit]

    Func _RichEdit_ResetHighlighting($hRichEdit)
    $hFocus = __RichEdit_Hasfocus()
    ConsoleWrite($hFocus & @CRLF)
    If $hFocus <> 0 Then
    $aSel = _GUICtrlRichEdit_GetSel($hFocus)
    _GUICtrlRichEdit_SetSel($hRichEdit, 1, -1, True)
    _GUICtrlRichEdit_SetCharBkColor($hRichEdit, 0xFFFFFF)
    _GUICtrlRichEdit_SetSel($hFocus, $aSel[0], $aSel[1])
    _GUICtrlRichEdit_SetModified($hRichEdit, False)
    _GUICtrlRichEdit_SetModified($hFocus, False)
    EndIf
    EndFunc ;==>_RichEdit_ResetHighlighting

    [/autoit]

    Leider habe ich das Problem bisher nicht lösen können.

    Anderes Beispiel:
    TestString ist "hallohallo".
    Wir suchen nun nach "hallo$"
    Gefunden wird von StringRegExp der zweite Teil (der, wo "hallo" ans Zeilenende grenzt.). StringInStr findet natürlich nur das erste Vorkommen, weil StringRegExp auch nur "hallo" zurückgibt.

    Hat einer eine Idee, wie ich dieses Problem in den Griff kriege?

    • Offizieller Beitrag

    Vielleicht hilft Dir das hier weiter:

    [autoit]


    $string = 'hallohallohallo'
    $found = 1
    $search = 'hallo'
    While True
    $found = StringInStr($string, $search, 1, 1, $found)
    ConsoleWrite('Position:' & $found & @CR)
    If $found = 0 Then ExitLoop
    MsgBox(0, '', StringReplace($string, $found, StringUpper($search), 1))
    $found += StringLen($search)
    WEnd

    [/autoit]
    • Offizieller Beitrag

    Achso, ja klar. Aber das geht auch mit RegExp:

    [autoit]


    $string = 'hallohallohallo'
    $found = 1
    $search = 'hallo'
    While True
    StringRegExp($string, $search, 1, $found)
    $next = @extended
    ConsoleWrite('Position:' & $found & @CR)
    If $next = 0 Then ExitLoop
    MsgBox(0, '', StringReplace($string, $found, StringUpper($search), 1))
    $found = $next
    WEnd

    [/autoit]