Android Tutorial Reguläre Ausdrücke (Regular expressions) Tutorial

klaus

Expert
Licensed User
Longtime User
Reguläre Ausdrücke (regular expressions) sind sehr leistungsfähig und machen kompliziertes herausforderndes Zergliedern (parsing) von Texten viel leichter.
Diese kurze Anleitung beschreibt die Verwendung von regulären Ausdrücken in Basic4android.
Wenn Sie mit regulären Ausdrücken nicht vertraut sind, finden Sie viele gute Tutorials online. Ich empfehle Ihnen, mit diesem zu starten:
Regular Expression Tutorial - Learn How to Use Regular Expressions

Basic4android verwendet das Java Engine für reguläre Ausdrücke. Diese Seite gibt mehr Informationen für bestimmte Details im Zusammenhang mit diesem Engine: Pattern (Java Platform SE 6)


Reguläre-Ausdruck Methoden haben in Basic4android das vordefinierte Objekt namens Regex. Sie können Regex schreiben gefolgt von einem Punkt um die Verfügbaren Methoden zu sehen.


Alle Methoden akzeptieren einen Muster-String (pattern string). Dies ist das Muster des regulären Ausdrucks. Beachten Sie, daß intern die kompilierten Muster zwischengespeichert werden. Es gibt also keinen Performance-Verlust bei mehrfacher Verwendung des gleichen Musters.

Für jede Methode gibt es zwei Varianten. Der Unterschied zwischen den Varianten ist, daß die zweite einen "Option" Parameter enthält, der auf das Verhalten der Engine wirkt. Zur Zeit gibt es zwei Optionen, CASE_INSENSITIVE und MULTILINE. CASE_INSENSITIVE macht den Mustervergleich unempfindlich gegen Groß-und Kleinschreibung. MULTILINE setzt die String Anker ^ und & auf Beginn und Ende jeder Zeile statt dem Beginn und Ende des ganzen Strings.
Beide Optionen können durch Aufruf von Bit.Or (Regex.MULTILINE, Regex.CASE_INSENSITIVE) kombiniert werden

Ganzen String vergleichen
IsMatch und IsMatch2 sind gut, um Benutzereingaben zu validieren. Das Ergebnis dieser Methoden ist True, wenn der gesamte String mit dem Muster übereinstimmt.

Zum Beispiel: Der folgende Code überprüft, ob ein Datum-String in einem Format eingeben wurde das diesem Muster "12-31-2010" ähnlich ist
B4X:
    Log(Regex.IsMatch("\d\d-\d\d-\d\d\d\d", "11-15-2010")) 'True
    Log(Regex.IsMatch("\d\d-\d\d-\d\d\d\d", "12\31\2010")) 'False
Der String "99-99-9999" entspricht aber auch diesem Muster.

Texte zerteilen
Split and Split2 zerteilt einen Text um ein gegebenes Muster.
Einfaches Beispiel:

B4X:
Dim data As String
data = "123,432,13,4,12,534"
Dim numbers() As String
numbers = Regex.Split(",", data)
Dim l As List
l.Initialize2(numbers)
Log(l)
Listen können leicht mit Log angezeigt werden, deshalb haben wir das Array in eine Liste eingefügt.
Das Resultat ist:

regex_1.png


Das Komma und Leerzeichen kommen von der Formatierung der Liste. Die Zerteilung ist wie erwartet.


Jetzt wenn der Originalstring "123, 432 , 13 , 4 , 12, 534" wäre,
wäre das Resultat nicht 'perfekt':

regex_2.png


Es sind mehr Lehrzeichen im Resultat die von der Zerteilung kommen.

Wir können das Muster ändern daß Komma oder Leerzeichen in Betracht gezogen werden:

B4X:
numbers = Regex.Split("[,\s]", data)
Das Resultat ist immer noch nicht was wir wollen:

regex_4.png


Viele Leerzeichen wurden eingefügt.
Das richtige Muster, in diesem Fall, ist:

B4X:
numbers = Regex.Split("[,\s]+", data)
Muster in einem String finden
Hier haben wir einen langen String, und wir wollen alle Aufkommen (matches) des Musters (pattern) im String finden. Wir können auch Capture-Groups benutzen um bestimmte Teile im Aufkommen zu bekommen.


Als Beispiel wollen wir E-Mail Adressen im gegebenen Text finden und anzeigen:
B4X:
Dim data As String
data = "Please contact mike@gmail.com or john@gmail.com"
Dim matcher1 As Matcher
matcher1 = Regex.Matcher("\w+@\w+\.\w+", data)
Do While matcher1.Find = True
    Log(matcher1.Match)
Loop
Dieser Code zeigt folgendes an:
mike@gmail.com
john@gmail.com

Beachten Sie, daß dieses Muster bei weitem noch nicht optimal ist für das Suchen von E-Mails.


Im zweiten Beispiel werden wir einen Matcher mit Capture-Groups verwenden um die Erfassung von einem Datumtext zu validieren. Das Muster ist dem Muster vom ersten Beispiel ähnlich aber mit der Zugabe von Klammern. Diese Klammern markieren die Gruppen:
B4X:
Log(IsValidDate("13-31-1212")) 'false
Log(IsValidDate("12-31-1212")) 'true

Sub IsValidDate(Date As String) As Boolean
    Dim matcher1 As Matcher
    matcher1 = Regex.Matcher("(\d\d)-(\d\d)-(\d\d\d\d)", Date)
    If matcher1.Find = True Then
        Dim days, months As Int
        months = matcher1.Group(1) 'fetch the first captured group.
        days = matcher1.Group(2) 'fetch the second captured group
        If months > 12 Then Return False
        If days > 31 Then Return False
        Return True
    Else
        Return False
    End If
End Sub
Die Group-Funktion ist wirklich sehr nützlich. Falls Sie String.IndexOf zusammen mit String.Substring mehrfach aufrufen wäre es vorteilhaft Regex und Matcher zu benutzen.

Das Englische Originaltutorial.
 
Top