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
Der String "99-99-9999" entspricht aber auch diesem Muster.
Texte zerteilen
Split and Split2 zerteilt einen Text um ein gegebenes Muster.
Einfaches Beispiel:
Listen können leicht mit Log angezeigt werden, deshalb haben wir das Array in eine Liste eingefügt.
Das Resultat ist:
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':
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:
Das Resultat ist immer noch nicht was wir wollen:
Viele Leerzeichen wurden eingefügt.
Das richtige Muster, in diesem Fall, ist:
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:
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:
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.
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
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)
Das Resultat ist:
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':
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)
Viele Leerzeichen wurden eingefügt.
Das richtige Muster, in diesem Fall, ist:
B4X:
numbers = Regex.Split("[,\s]+", data)
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
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
Das Englische Originaltutorial.