Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: nimora am Juli 25, 2015, 20:55:09

Titel: regex-Prügung - aber richtig
Beitrag von: nimora am Juli 25, 2015, 20:55:09
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öööö :)
Titel: Re: regex-Prügung - aber richtig
Beitrag von: ebs17 am Juli 25, 2015, 22:21:48
    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
Titel: Re: regex-Prügung - aber richtig
Beitrag von: nimora am Juli 25, 2015, 23:04:32
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
Titel: Re: regex-Prügung - aber richtig
Beitrag von: nimora am Juli 26, 2015, 00:12:09
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... :)