Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1200to1204
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Mit RegEx in Kommentaren Suchen und Ersetzen
Axel
hi ihr fleißigen Helfer,
ich brauche eine Funktion die in den Kommentaren aller markierten Zellen einen Replace mit Hilfe von RegEx macht um die Reihenfolge des Textes umzustellen. Wichtig ist also dass beim Suchbegriff das Klammern möglich sein muss!
Beispiel:
Samstag 123 soll per RegEx ersetzt werden in 123 Samstag. Ein Möglichkeit wäre:
Suche nach: (S[a-z]+) ([0-9]+)
Ersetzte durch: \2 \1
Die runden Klammern definieren den zu speichernden Bereich, der Backslash und die nachfolgende Nummer beim Ersetzen stellt den Speicher gemäß der Reihenfolge ihres Auftretens im regulären Ausdruck dar. Könnte auch sein dass es $2 $1 lauten muss oder noch ganz anders...
Ich habe von euch bereits eine Funktion die normales Suchen und Ersetzen beherrscht und zusätzlich noch den Zeilenumbruch nach dem Suchstring entfernt, vielleicht hilft es ja ein wenig als Vorlage:
  • 
    Public Sub Kommentar_SucheErsetzen()
    Dim ZElle As Range
    Dim Arr
    Dim I
    Dim stext As String
    Dim Suche As String
    Dim Ersetze As String
    Suche = InputBox("Suchen nach:", "Kommentar Suchen & Ersetzen")
    If StrPtr(Suche) > 0 Then
    If Suche  "" Then
    Ersetze = InputBox("Ersetze durch:", "Kommentar Suchen & Ersetzen")
    For Each ZElle In Cells.SpecialCells(xlCellTypeComments)
    stext = ZElle.Comment.Text
    Arr = Split(stext, vbLf)
    For I = LBound(Arr) To UBound(Arr)
    If Arr(I) Like Suche Then stext = Replace(stext, Arr(I) & vbLf, Ersetze)
    Next
    ZElle.Comment.Text stext
    Next
    End If
    End If
    End Sub
    

  • Es muss diesmal nicht unbedingt mit InputBox sein ;)
    Danke und mfG
    Axel
    Lookbehind_Assertion geht nicht !?!?
    26.02.2011 18:30:36
    ransi
    HAllo
    ICh kann dir auch nur einen Ansatz bieten.
    Option Explicit

    Const S = "Beispiel: Samstag 123. irgendwas anderes."

    Public Sub Positive_Lookahead_Assertion()
            Dim Regex As Object
            Dim M As Object
            Set Regex = CreateObject("vbScript.Regexp") 'Samstag vor " 123" kann ich finden.
            .Pattern = "S[a-z]+(?= [0-9]+)"
            .Global = True
            Set M = .Execute(S)
            MsgBox M(0) & " gefunden"
        End With
    End Sub


    Public Sub Positive_Lookbehind_Assertion()
        Dim Regex As Object
        Dim M As Object
        Set Regex = CreateObject("vbScript.Regexp")
        With Regex
            .Pattern = "(?<=Samstag )[0-9]+" 'Sollte eigentlich [0-9]+ nach "Samstag " finden.
            .Global = True
            Set M = .Execute(S) 'Laufzeitfehler 5017.Warum ?
            MsgBox M(0)
        End With
    End Sub


    ICh weiss nicht warum detr zweite Code nicht läuft.
    In diversen RegEx testern funktioniert das Pattern.
    Vielecht schaut da mal jemand drüber der was davon versteht.
    Darum "Frage noch offen".
    ransi
    Anzeige
    Regexp testern
    26.02.2011 19:11:03
    Reinhard
    Hallo Ransi,
    das "r" in testern irritiert mich, es soll nicht testen heißen?
    Also irgendwelche Programme die regexp bzw. Pattern testen?
    Ich habe im Lauf der Zeit gelegentlich Vorstöße ins regexp-Gebiet unternommen, ganz ganz einfache Dinge schaffte ich, aber sobald es schwierig wurde war Ende :-)
    Aber auch unabhängig von einem kommenden Versteher :-) vielleicht kannst du mir das ja auch sagen.
    Nützt mir regexp sinnvoll wen ich das nachfolgende parsen will so daß ich alle Titel, Artisten, Albums Seconds usw. extrahieren kann? XXXX=Unwichtig.
    XXXXXRebeka Adam Aston 
    Orkiestra Syrena Rekord Henryka Warsa
    Adam_Aston_-_Rebeka_-_i_Orkiestra_Syrena_Rekord_pod.mp3
    XXXXX190
    Breakaway Harry Bidgood Broadcasters 
    Vocal Trio 
    Harry_Bidgood_Broadcasters_-_Breakaway_-_Vocal_Trio_-_June_8th_1929.mp3
    XXXXX
    166
    NONE
    RPI_0044_01030403_32_11_jst.mp3
    adProgressiveXXXXX30
    NONE
    BHTR1012_021427_32_11_jst.mp3
    adH&R BlockXXXXX30
    XXXXX
    

    Anzeige
    AW: Regexp testern
    26.02.2011 19:22:56
    ransi
    HAllo
    ICh meinte wirklich Regex Tester.
    Also irgendwelche Programme die regexp bzw. Pattern testen !
    Der hier ist recht einfach zu bedienen:
    http://regexp-tester.mediacix.de/exp/regex/
    Zu deiner andern Frage:
    ICh versteh nicht was da extrahiert werden soll.
    Mach doch mal nen Extra Thread auf.
    DAnn schauen wir weiter.
    ransi
    AW: Regexp testern
    26.02.2011 19:46:46
    Reinhard
    Hallo Ransi,
    nö, lassen wir mal glaub. Ich löse das konventionell, also erst nach suchen. dann anch usw.
    Ich hatte in der Zwischenzeit geschaut was du meinen könntest, vielleicht ist das Gefundene für dich brauchbar, wenn nicht isses auch gut, mir sowieso zu kompliziert, dann noch Englisch:-(
    http://www.radsoftware.com.au/regexdesigner/
    Gruß
    Reinhard
    noch offen vergessen o.T.
    26.02.2011 19:23:40
    ransi
    o.w.T.
    AW: noch offen vergessen o.T.
    26.02.2011 19:38:15
    Axel
    bei mir geht leider noch nicht mal das erste Beispiel !?!
    muss ich noch ein add-in nachinstallieren damit regex funktioniert?
    AW: noch offen vergessen o.T.
    26.02.2011 19:49:47
    ransi
    HAllo Axel
    muss ich noch ein add-in nachinstallieren damit regex funktioniert?
    Eigentlich nicht. Der Code sollte eigentlich so wie er ist laufen.
    Was heißt "geht..nicht..." ?
    PC gibt Rauchzeichen oder Fehlermeldung oder, oder, oder ?
    ransi
    Anzeige
    OT
    26.02.2011 20:03:45
    Reinhard
    Hallo Ransi,
    zu "geht nicht" mal was aus einem Forum wo es um Spritpreise ging:
    "Wo gehen die Spritpreise hin ? Unglaublich was da passiert -oder ?"
    Bei uns nicht. Dort sind die Preise immer oben.
    Und die Preistafel an der Straße ist noch nie irgend wo hin gegangen. Die Preise sind immer dort oben."
    :-)
    Gruß
    Reinhard
    AW: noch offen vergessen o.T.
    26.02.2011 20:41:46
    Axel
    Makro stoppt bei ".Pattern."
    Fehlmeldung: "Fehler beim Komplilieren. Unzulässiger oder nicht ausreichend definierter Verweis"
    AW: noch offen vergessen o.T.
    26.02.2011 20:51:29
    ransi
    HAllo
    Oooops.
    Da is was verschütt gegangen...
    my fault.
    Option Explicit



    Const S = "Beispiel: Samstag 123. irgendwas anderes."

    Public Sub Positive_Lookahead_Assertion()
        Dim Regex As Object
        Dim M As Object
        Set Regex = CreateObject("vbScript.Regexp") 'Samstag vor " 123" kann ich finden.
        With Regex '#########
            .Pattern = "S[a-z]+(?= [0-9]+)"
            .Global = True
            Set M = .Execute(S)
            MsgBox M(0) & " gefunden"
        End With
    End Sub



    Public Sub Positive_Lookbehind_Assertion()
        Dim Regex As Object
        Dim M As Object
        Set Regex = CreateObject("vbScript.Regexp")
        With Regex
            .Pattern = "(?<=Samstag )[0-9]+" 'Sollte eigentlich [0-9]+ nach "Samstag " finden.
            .Global = True
            Set M = .Execute(S) 'Laufzeitfehler 5017.Warum ?
            MsgBox M(0)
        End With
    End Sub



    ransi
    Anzeige
    AW: noch offen vergessen o.T.
    26.02.2011 21:36:28
    Axel
    mit 2 Pattern gehts:
  • Option Explicit
    Const S = "Beispiel: Samstag 123. irgendwas anderes."
    Public Sub Positive_Lookahead_Assertion()
    Dim Regex As Object
    Dim Regex2 As Object
    Dim M As Object
    Dim N As Object
    Set Regex = CreateObject("vbScript.Regexp")
    With Regex
    .Pattern = "S[a-z]+"
    .Global = True
    Set M = .Execute(S)
    End With
    Set Regex2 = CreateObject("vbScript.Regexp")
    With Regex
    .Pattern = "\d+"
    .Global = True
    Set N = .Execute(S)
    End With
    MsgBox N(0) & " " & M(0) & " gefunden"
    End Sub
    

  • jetzt muß das nur noch auf den Kommentar angewendet werden, ich versuchs mal, über Hilfe wär ich trotzdem dankbar
    Anzeige
    vbscript unterstützt keine LookBehinds
    27.02.2011 11:23:49
    ransi
    HAllo Axel
    Wenn du das so machen willst wirds fehleranfällig.
    Dann bleib leiber bei deinem ersten Pattern und splitte die Treffer das nach " ".
    Den vorderen mit dem Hinteren tauschen und gut ists...
    Hat aber dann mit "..einen Replace mit Hilfe von RegEx macht ...Ersetzte durch: \2 \1.."
    nichts mehr zu tun.
    Option Explicit


    Public Sub Kommentar_SucheErsetzen()
        Dim ZElle As Range
        Dim Arr
        Dim I
        Dim stext As String
        Dim Suche As String
        Dim Ersetze As String
        Suche = InputBox("Suchen nach:", "Kommentar Suchen & Ersetzen")
        If StrPtr(Suche) > 0 Then
            If Suche <> "" Then
                Ersetze = InputBox("Ersetze durch:", "Kommentar Suchen & Ersetzen")
                For Each ZElle In Cells.SpecialCells(xlCellTypeComments)
                    stext = ZElle.Comment.Text
                    Arr = Split(stext, vbLf)
                    For I = LBound(Arr) To UBound(Arr)
                        If Arr(I) Like Suche Then stext = Replace(stext, Arr(I) & vbLf, Ersetze)
                    Next
                    ZElle.Comment.Text machs(stext) '####
                Next
            End If
        End If
    End Sub




    Public Function machs(strText As String)
        Dim Regex As Object
        Dim M As Object
        Dim strTmp As String
        Dim Treffer As Object
        Dim Arr As Variant
        strTmp = strText
        Set Regex = CreateObject("vbScript.Regexp")
        With Regex
            .Pattern = "S[a-z]+ [0-9]+"
            .Global = True
            Set M = .Execute(strTmp)
            If M.Count Then
                For Each Treffer In M
                    Arr = Split(Treffer, " ")
                    strTmp = .Replace(strTmp, Arr(1) & " " & Arr(0))
                Next
            End If
        End With
        machs = strTmp
    End Function


    ransi
    Ach ja...
    Habs gefunden:
    Vbscript unterstützt einfach keine Lookbehinds
    http://www.regular-expressions.info/vbscript.html
    Anzeige
    Regexp Submatches
    27.02.2011 11:32:40
    Christian
    Hallo zusammen,
    mein Vorschlag:
    Option Explicit
    Const strSOURCE As String = "Beispiel: Samstag 123. irgendwas 234. Super 456"
    Sub TestIt()
    Dim objRgx As Object
    Dim objMatches As Object
    Dim objMatch As Object
    Set objRgx = CreateObject("Vbscript.Regexp")
    With objRgx
    .Pattern = "(S[a-z]+)\s(\d+)"
    .Global = True
    .MultiLine = False
    End With
    Set objMatches = objRgx.Execute(strSOURCE)
    For Each objMatch In objMatches
    With objMatch
    Debug.Print .SubMatches(0)
    Debug.Print .SubMatches(1)
    End With
    Next
    Set objMatch = Nothing
    Set objMatches = Nothing
    Set objRgx = Nothing
    End Sub
    
    Gruß
    Christian
    Anzeige
    AW: Mit RegEx in Kommentaren Suchen und Ersetzen
    27.02.2011 17:36:34
    Axel
    danke erstmal euch allen.
    RegEx Replace SubMatches
    28.02.2011 17:35:27
    Christian
    Hall Axel,
    hier noch eine Variante mit Replace entsprechend deiner ursprünglichen Frage. Funktioniert so aber nur mit "Global = False", sprich bei einem Treffer.
    Gruß
    Christian
    Option Explicit
    Const strSOURCE As String = "Beispiel: Samstag 123. irgendwas"
    Sub ExchangeSubMatches()
    Dim objRgx As Object
    Dim objMtch As Object
    Set objRgx = CreateObject("Vbscript.Regexp")
    With objRgx
    .Pattern = "(S[a-z]+)\s(\d+)"
    .Global = False
    .MultiLine = False
    End With
    Debug.Print strSOURCE
    Set objMtch = objRgx.Execute(strSOURCE)
    If objRgx.Test(strSOURCE) Then
    With objMtch(0)                 'first match
    Debug.Print objRgx.Replace(strSOURCE, .SubMatches(1) & " " & .SubMatches(0))
    End With
    Else
    Debug.Print "no match"
    End If
    Set objMtch = Nothing
    Set objRgx = Nothing
    End Sub
    

    Anzeige

    326 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige