Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

regex-Prügung - aber richtig

Begonnen von nimora, Juli 25, 2015, 20:55:09

⏪ vorheriges - nächstes ⏩

nimora

Hallo schon wieder :)

also, ich möchte aus einem Textfeld, in dem ein länger Text und email-Adresse stehen genau die Mail-Adresse herausfiltern. Dazu verwende ich eine RegEx-Prüfung. so:
Private Sub Befehl7_Click()
    Dim objRegExp As regexp       
    Dim objMatchCollection As MatchCollection
    Dim objMatch As Match
    Dim strSuchbegriff As String
    strSuchbegriff = "test"
    Dim strOriginal As String
    strOriginal = Me.textfeld
   
   
    Set objRegExp = New regexp
    With objRegExp
    .Pattern = strSuchbegriff
    .Global = True
    Set objMatchCollection = _
    .Execute(strOriginal)
    For Each objMatch In objMatchCollection
    Debug.Print "Wert: " & objMatch.Value
    Next objMatch
    End With
End Sub


das funzt auch, nur sucht dieser Code nur nach Worten, dich ich schon kenne. Hier "test". Ich kenne aber die Mail-adressen aber nicht, nur das @ ist mir natürlich bekannt. außerdem ist dies keine regex-Prüfung, wie ich sie verstehe. Suchen möchte ich hiernach: "SMTP:([a-zA-Z0-9\-_]?[a-zA-Z0-9.\-_]+[a-zA-Z0-9\-_]?@[a-zA-Z.-]+\.[a-zA-Z[^\]]]{2,3})"

das funzt auch bei regex-testern. wenn ich das aber statt des strings "test" eingebe funzt es eben nicht.

Es kommt kein fehler, aber es wird auch nichts gefunden. und wie gesagt, auf testseiten für regex klappt das.

wie wird also eine "richtige" regex ausgeführt?

Danköööö :)

ebs17

#1
    With objRegExp
        .Multiline = True
    ' ...


Hilft das schon?

Außerdem sollte man in jedem Fall einen Nichttreffer einkalkulieren:
If objMatchCollection.Count > 0 Then
    For Each objMatch In objMatchCollection
        Debug.Print "Wert: " & objMatch.Value
    Next objMatch
Else
    Debug.Print "kein Treffer"
End If
Mit freundlichem Glück Auf!

Eberhard

nimora

hi ebs17,

habe es eingefügt, ändert aber nichts.

aber der code, den ich hier aufgeführt habe, funktioniert ja. aber eben nur mit strSuchbegriff = "test"

wenn ich dort die richtige regex reinsetze, passiert nix

mit deiner schleife wird "kein treffer" ausgegeben.

die frage ist also, wird die regex überhaupt korrekt verarbeitet? oder muss ich die irgendwie anders angeben. hier noch mal der code, der keinen treffer ergib:
Private Sub Befehl7_Click()
    Dim objRegExp As regexp
       
    Dim objMatchCollection As MatchCollection
    Dim objMatch As Match
    Dim strSuchbegriff As String   
    strSuchbegriff = "([a-zA-Z0-9\-_]?[a-zA-Z0-9.\-_]+[a-zA-Z0-9\-_]?@[a-zA-Z.-]+\.[a-zA-Z[^\]]]{2,3})"
    Dim strOriginal As String
    strOriginal = Me.textfeld
   
   
    Set objRegExp = New regexp
    With objRegExp
    .Pattern = strSuchbegriff
    .Multiline = True
    .Global = True
    Set objMatchCollection = _
    .Execute(strOriginal)
        If objMatchCollection.Count > 0 Then
            For Each objMatch In objMatchCollection
                Debug.Print "Wert: " & objMatch.Value
            Next objMatch
        Else
            Debug.Print "kein Treffer"
        End If
    End With
End Sub

nimora

so! scheinbar gibt es unterschiede in der interpretation einiger regex tools. scheinbar war der gesuchte ausdruck flasch.

mit diesem hier funktioniert es: ([a-zA-Z0-9_\-\.]+)@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})

somit ist hier der vollständige, funktionierende code:
Private Sub Befehl7_Click()
    Dim objRegExp As regexp
       
    Dim objMatchCollection As MatchCollection
    Dim objMatch As Match
    Dim strSuchbegriff As String   
    strSuchbegriff = "([a-zA-Z0-9_\-\.]+)@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})"
    Dim strOriginal As String
    strOriginal = Me.textfeld
   
   
    Set objRegExp = New regexp
    With objRegExp
    .Pattern = strSuchbegriff
    .Multiline = True
    .Global = True
    Set objMatchCollection = _
    .Execute(strOriginal)
        If objMatchCollection.Count > 0 Then
            For Each objMatch In objMatchCollection
                Debug.Print "Wert: " & objMatch.Value
            Next objMatch
        Else
            Debug.Print "kein Treffer"
        End If
    End With
End Sub


Besten Dank, letztlich hat die schleife geholfen... :)