Recherche…


Idioms pour Regex correspondant à quand expression

Utiliser des locaux immuables:

Utilise moins d'espace horizontal mais plus d'espace vertical que le modèle "anonymous temporaries". Préférable sur le modèle "anonymous temporaries" si l'expression when est dans une boucle - dans ce cas, les définitions regex doivent être placées en dehors de la boucle.

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 */
}

Utiliser des temporaires anonymes:

Utilise moins d'espace vertical mais plus d'espace que le modèle "locaux immuables". Ne doit pas être utilisé si alors when expression est en boucle.

import kotlin.text.regex

var string = /* some string */

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

En utilisant le modèle de visiteur:

A l'avantage de reproduire étroitement le "argument-ful" when syntaxe. Cela est bénéfique car il indique plus clairement l'argument de l'expression when , et exclut également certaines erreurs de programmeur qui pourraient découler de la répétition de l'argument when dans chaque whenEntry . Le modèle "immuable locals" ou "anonymous temporaries" peut être utilisé avec cette implémentation du pattern visiteur.

import kotlin.text.regex

var string = /* some string */

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

Et la définition minimale de la classe wrapper pour l'argument expression when :

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

Introduction aux expressions régulières dans Kotlin

Cet article montre comment utiliser la plupart des fonctions de la classe Regex , travailler avec des valeurs null liées aux fonctions Regex , et comment les chaînes brutes facilitent l'écriture et la lecture des modèles regex.

La classe RegEx

Pour travailler avec des expressions régulières dans Kotlin, vous devez utiliser la classe Regex(pattern: String) et appeler des fonctions telles que find(..) ou replace(..) sur cet objet regex.

Un exemple d'utilisation de la classe Regex qui renvoie true si la chaîne d' input contient c ou d:

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

La chose essentielle à comprendre avec toutes les fonctions Regex est que le résultat est basé sur la correspondance du pattern expression régulière et de la chaîne d' input . Certaines fonctions nécessitent une correspondance complète, tandis que le reste ne nécessite qu'une correspondance partielle. La fonction containsMatchIn(..) utilisée dans l'exemple nécessite une correspondance partielle et est expliquée plus loin dans cette publication.

Sécurité nulle avec des expressions régulières

Les deux find(..) et matchEntire(..) MatchResult? un MatchResult? objet. Le ? caractère après MatchResult est nécessaire pour Kotlin pour gérer NULL en toute sécurité .

Un exemple qui montre comment Kotlin gère NULL en toute sécurité depuis une fonction Regex , lorsque la fonction find(..) renvoie null:

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. => ""

Avec la fonction orEmpty() , b ne peut pas être nul et le ? le caractère est inutile lorsque vous appelez des fonctions sur b .

Si vous ne vous souciez pas de cette manipulation sécurisée des valeurs NULL, Kotlin vous permet de travailler avec des valeurs NULL comme en Java avec le !! personnages:

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

Chaînes brutes dans les modèles d'expressions rationnelles

Kotlin fournit une amélioration par rapport à Java avec une chaîne brute qui permet d'écrire des modèles de regex purs sans double barre oblique inverse, nécessaires avec une chaîne Java. Une chaîne brute est représentée avec un triple devis:

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

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

La chaîne d' input sera comparée au pattern dans l'objet Regex . Il retourne un Matchresult? objet avec le premier texte correspondant après le startIndex , ou null si le motif ne correspond pas à la chaîne d' input . La chaîne de résultat est extraite de MatchResult? propriété value objet. Le paramètre startIndex est facultatif avec la valeur par défaut 0.

Pour extraire le premier numéro de téléphone valide d'une chaîne avec ses coordonnées:

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

En l'absence de numéro de téléphone valide dans la chaîne d' input , la variable phoneNumber sera null .

findAll (entrée: CharSequence, startIndex: Int): séquence

Renvoie toutes les correspondances de la chaîne d' input correspondant au pattern regex.

Pour imprimer tous les nombres séparés par un espace, à partir d'un texte avec des lettres et des chiffres:

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

println(result) // => 12 34

La variable matchedResults est une séquence MatchResult objets MatchResult . Avec une chaîne d' input sans chiffres, la fonction findAll(..) renvoie une séquence vide.

matchEntire (entrée: CharSequence): MatchResult?

Si tous les caractères de la chaîne d' input correspondent au pattern expression régulière, une chaîne égale à l' input sera renvoyée. Sinon, null sera retourné.

Renvoie la chaîne d'entrée si la chaîne d'entrée entière est un nombre:

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

correspond à (input: CharSequence): booléen

Renvoie true si la chaîne d'entrée complète correspond au modèle de regex. Faux sinon.

Teste si deux chaînes ne contiennent que des chiffres:

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

containsMatchIn (input: CharSequence): Booléen

Renvoie true si une partie de la chaîne d'entrée correspond au modèle de regex. Faux sinon.

Testez si deux chaînes contiennent au moins un chiffre:

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

split (input: CharSequence, limite: Int): Liste

Renvoie une nouvelle liste sans toutes les correspondances regex.

Pour retourner des listes sans chiffres:

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

Il y a un élément dans la liste pour chaque division. La première chaîne d' input comporte trois chiffres. Cela se traduit par une liste de trois éléments.

replace (input: CharSequence, replacement: String): String

Remplace toutes les correspondances du pattern regex dans la chaîne d' input par la chaîne de remplacement.

Pour remplacer tous les chiffres d'une chaîne par un x:

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow