Suche…


Idiome für Regex-Abgleich in When-Ausdruck

Verwenden unveränderlicher Einheimischer:

Verwendet weniger horizontalen Raum, aber mehr vertikalen Raum als die Vorlage "Anonyme temporäre". Vorzuziehen gegenüber der Vorlage "anonyme temporäre", wenn sich der when Ausdruck in einer Schleife befindet. In diesem Fall sollten Regex-Definitionen außerhalb der Schleife platziert werden.

import kotlin.text.regex

var string = /* some string */

val regex1 = Regex( /* pattern */ )
val regex2 = Regex( /* pattern */ )
/* etc */

when {
    regex1.matches(string) -> /* do stuff */
    regex2.matches(string) -> /* do stuff */
    /* etc */
}

Verwendung anonymer Provisorien:

Verwendet weniger vertikalen Raum, aber mehr horizontalen Raum als die Vorlage "unveränderliche Einheimische". Sollte nicht verwendet werden, when Ausdruck in einer Schleife befindet.

import kotlin.text.regex

var string = /* some string */

when {  
    Regex( /* pattern */ ).matches(string) -> /* do stuff */
    Regex( /* pattern */ ).matches(string) -> /* do stuff */
    /* etc */
}

Verwenden des Besuchermusters:

Hat den Vorteil, die "argument-ful" when Syntax genau zu emulieren. Dies ist vorteilhaft, da es klarer das Argument des when Ausdrucks anzeigt und bestimmte Programmiererfehler ausschließt, die daraus whenEntry könnten, dass das when Argument in jedem whenEntry wiederholt werden whenEntry . Bei dieser Implementierung kann entweder das "unveränderliche Einheimische" oder das "anonyme temporäre" Template verwendet werden.

import kotlin.text.regex

var string = /* some string */

when (RegexWhenArgument(string)) {
    Regex( /* pattern */ ) -> /* do stuff */
    Regex( /* pattern */ ) -> /* do stuff */
    /* etc */
}

Und die minimale Definition der Wrapper-Klasse für das Argument " when :

class RegexWhenArgument (val whenArgument: CharSequence) {
    operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument)
    override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry)
}

Einführung in reguläre Ausdrücke in Kotlin

In diesem Beitrag wird gezeigt, wie die meisten Funktionen in der Regex Klasse verwendet werden, wie mit Nullen gearbeitet wird, die sicher mit den Regex Funktionen zusammenhängen, und wie rohe Zeichenfolgen das Schreiben und Lesen von Regex-Mustern erleichtern.

Die RegEx-Klasse

Um mit regulären Ausdrücken in Kotlin zu arbeiten, müssen Sie die Klasse Regex(pattern: String) und Funktionen wie find(..) oder replace(..) für dieses Regex-Objekt aufrufen.

Ein Beispiel zur Verwendung der Regex Klasse, die true zurückgibt, wenn die input c oder d enthält:

val regex = Regex(pattern = "c|d")
val matched = regex.containsMatchIn(input = "abc")    // matched: true

Für alle Regex Funktionen ist es wichtig zu verstehen, dass das Ergebnis auf dem Abgleich des Regex- pattern und der input basiert. Einige Funktionen erfordern eine vollständige Übereinstimmung, während die restlichen Funktionen nur eine teilweise Übereinstimmung erfordern. Die in diesem Beispiel verwendete Funktion containsMatchIn(..) erfordert eine teilweise Übereinstimmung und wird später in diesem Beitrag erläutert.

Null Sicherheit mit regulären Ausdrücken

find(..) und matchEntire(..) MatchResult? ein MatchResult? Objekt. Die ? Ein Zeichen nach MatchResult ist für Kotlin erforderlich, um Null sicher zu behandeln.

Ein Beispiel, das zeigt, wie Kotlin mit einer Regex Funktion sicher mit Null Regex , wenn die find(..) Funktion Null zurückgibt:

val matchResult = 
    Regex("c|d").find("efg")           // matchResult: null
val a = matchResult?.value             // a: null
val b = matchResult?.value.orEmpty()   // b: ""
a?.toUpperCase()                       // Still needs question mark. => null    
b.toUpperCase()                        // Accesses the function directly. => ""

Mit der Funktion orEmpty() kann b nicht null sein und das ? Ein Zeichen ist nicht erforderlich, wenn Sie Funktionen über b aufrufen.

Wenn Sie sich nicht für den sicheren Umgang mit Nullwerten interessieren, können Sie mit Kotlin mit Nullwerten wie in Java mit dem !! Zeichen:

a!!.toUpperCase()                      // => KotlinNullPointerException

Raw-Strings in Regex-Mustern

Kotlin bietet eine Verbesserung gegenüber Java mit einem Raw-String , der das Schreiben reiner Regex-Muster ohne doppelte Backslashes ermöglicht, die für einen Java-String erforderlich sind. Eine rohe Zeichenfolge wird mit einem dreifachen Anführungszeichen dargestellt:

"""\d{3}-\d{3}-\d{4}""" // raw Kotlin string
"\\d{3}-\\d{3}-\\d{4}"  // standard Java string

find (Eingabe: CharSequence, startIndex: Int): MatchResult?

Die input wird mit dem pattern im Regex Objekt abgeglichen. Matchresult? ein Matchresult? Objekt mit dem ersten übereinstimmenden Text nach dem startIndex oder null wenn das Muster nicht mit der input übereinstimmt. Die Ergebniszeichenfolge wird vom MatchResult? abgerufen MatchResult? value Eigenschaft des Objekts. Der Parameter startIndex ist optional mit dem Standardwert 0.

So extrahieren Sie die erste gültige Telefonnummer aus einer Zeichenfolge mit Kontaktdaten:

val phoneNumber :String? = Regex(pattern = """\d{3}-\d{3}-\d{4}""")
    .find(input = "phone: 123-456-7890, e..")?.value // phoneNumber: 123-456-7890

Ohne gültige Telefonnummer in der input ist die Variable phoneNumber null .

findAll (Eingabe: CharSequence, StartIndex: Int): Sequenz

Gibt alle Übereinstimmungen aus der input , die dem Regex- pattern .

So drucken Sie alle mit Leerzeichen getrennten Zahlen aus einem Text mit Buchstaben und Ziffern:

val matchedResults = Regex(pattern = """\d+""").findAll(input = "ab12cd34ef")
val result = StringBuilder()
for (matchedText in matchedResults) {
    result.append(matchedText.value + " ")
}

println(result) // => 12 34

Die matchedResults Variable ist eine Sequenz mit MatchResult Objekten. Bei einer input ohne Ziffern gibt die findAll(..) Funktion eine leere Sequenz zurück.

matchEntire (Eingabe: CharSequence): MatchResult?

Wenn alle Zeichen in der input dem Regex- pattern , wird eine Zeichenfolge zurückgegeben, die der input . Andernfalls wird null zurückgegeben.

Gibt die Eingabezeichenfolge zurück, wenn die gesamte Eingabezeichenfolge eine Zahl ist:

val a = Regex("""\d+""").matchEntire("100")?.value             // a: 100
val b = Regex("""\d+""").matchEntire("100 dollars")?.value     // b: null

match (Eingabe: CharSequence): Boolean

Gibt "true" zurück, wenn die gesamte Eingabezeichenfolge dem Regex-Muster entspricht. Sonst falsch.

Testet, ob zwei Zeichenfolgen nur Ziffern enthalten:

val regex = Regex(pattern = """\d+""")
regex.matches(input = "50")             // => true
regex.matches(input = "50 dollars")     // => false

containsMatchIn (Eingabe: CharSequence): Boolean

Gibt "true" zurück, wenn ein Teil der Eingabezeichenfolge dem Regex-Muster entspricht. Sonst falsch.

Testen Sie, ob zwei Zeichenfolgen mindestens eine Ziffer enthalten:

Regex("""\d+""").containsMatchIn("50 dollars")       // => true
Regex("""\d+""").containsMatchIn("Fifty dollars")    // => false

split (Eingabe: CharSequence, Limit: Int): Liste

Gibt eine neue Liste ohne Übereinstimmungen mit den regulären Ausdrücken zurück.

Listen ohne Ziffern zurückgeben:

val a = Regex("""\d+""").split("ab12cd34ef")     // a: [ab, cd, ef]
val b = Regex("""\d+""").split("This is a test") // b: [This is a test]

Für jeden Split gibt es ein Element in der Liste. Die erste input hat drei Zahlen. Daraus ergibt sich eine Liste mit drei Elementen.

replace (Eingabe: CharSequence, Ersatz: String): String

Ersetzt alle Übereinstimmungen des Regex- pattern in der input durch die Ersetzungszeichenfolge.

So ersetzen Sie alle Ziffern in einer Zeichenfolge durch ein x:

val result = Regex("""\d+""").replace("ab12cd34ef", "x") // result: abxcdxef


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow