L'expression rationnelle correspondant dans Kotlin
Comment puis-je match secret_code_data en chaîne:
xeno://soundcloud/?code=secret_code_data#
J'ai essayé
val regex = Regex("""xeno://soundcloud/?code=(.*?)#""")
field = regex.find(url)?.value ?: ""
sans chance. Je soupçonne ? avant que le code pourrait être le problème, dois-je échapper en quelque sorte. Pouvez-vous m'aider?
- Pourquoi êtes-vous à l'aide de
.*?
? Je pense que tu veux dire simplement.*
- Essayez
field = regex.find(input)!!.groups[1]!!.value
et de mettre le?
dans une classe de caractères:[?]
. Ou quelque chose commeval regex = "xeno://soundcloud/[?]code=(.*?)#".toRegex() // val input = "xeno://soundcloud/?code=secret_code_data#" // val result = regex.find(input)!!.groups[1]!!.value
. - Je suggère l'analyse de l'url et d'en extraire les paramètres de la requête au lieu d'utiliser des RegEx.
- J'ai pris la regex, ainsi que l'utilisation d'autres l'analyse des modèles ci-dessous. Regex n'est pas sûr si l'URL de caractères codés, ou vous essayez de décoder comme un ensemble de la chaîne.
- stackoverflow.com/questions/1732348/...
Vous devez vous connecter pour publier un commentaire.
Voici trois options, la première fournissant une bonne Regex qui fait ce que vous voulez, et les deux autres pour l'analyse d'URL à l'aide d'une alternative à la Regex poignée composant de l'URL de l'encodage/décodage correctement.
L'analyse en utilisant les Regex
REMARQUE: Regex méthode est dangereuse, dans la plupart des cas, car il n'a pas d'analyser correctement l'URL dans les composants, puis décoder chaque composant séparément. Normalement, vous ne peut pas décoder l'ensemble de l'URL en une seule chaîne et ensuite d'analyser en toute sécurité, car certains caractères codés peuvent confondre les Regex plus tard. Ceci est similaire à l'analyse XHTML en utilisant les regex (comme décrit ici). Voir les alternatives à l'expression régulière ci-dessous.
Ici est nettoyé regex comme un scénario de test unitaire qui gère plusieurs Url en toute sécurité. À la fin de ce post est une unité de test que vous pouvez utiliser pour chaque méthode.
Cette expression s'occupe de ces cas:
/
en cheminNoter que idiomatiques moyen de faire une regex dans Kotlin est
someString.toRegex()
. Elle et d'autres méthodes d'extension peuvent être trouvés dans la Kotlin de Référence de l'API.L'analyse en utilisant UriBuilder ou de catégorie similaire
Voici un exemple d'utilisation de la
UriBuilder
de la Klutter bibliothèque de Kotlin. Cette version gère encodage/décodage y compris les plus modernes JavaScript encodages unicode ne sont pas manipulés par la norme JavaURI
classe (qui a beaucoup de questions). C'est sûr, facile, et vous n'avez pas besoin de vous soucier de tous les cas particuliers.Mise en œuvre:
La Klutter
uy.klutter:klutter-core-jdk6:$klutter_version
artefact est petit et comprend quelques autres extensions incluent l'modernisé URL d'encodage/décodage. (Pour$klutter_version
utiliser le la plupart des version actuelle).Analyse avec JDK Classe URI
Cette version est un peu plus long, et montre, vous devez analyser les raw chaîne de requête, vous-même, décoder après l'analyse, puis de trouver le paramètre de requête:
Ce qui pourrait être écrit comme une extension de l'URI de la classe elle-même:
Dans le corps à éliminer
parsed
variable et utiliserthis
puisque vous avez déjà l'URI, eh bien, vous ÊTES l'URI. Ensuite appel à l'aide:Tests Unitaires
Donné de l'une des fonctions ci-dessus, l'exécution de ce test pour prouver que cela fonctionne:
groups!![0]
ressemble de plus idiomatique quegroups?.get(0)
.?.let{ ... }
n'importe où vraiment aider à nettoyer.Ajouter une fuite en avant de la première interrogation, car il a une signification particulière
devient
Vous sont également capturer le code secret dans le premier groupe. Pas sûr que le kotlin code qui suit est l'extraction du premier groupe si.
Regex("""xeno://soundcloud/\?code=(.*?)#""").find("xeno://soundcloud/?code=secret_code_data#")?.value
retourne"xeno://soundcloud/?code=secret_code_data#"
pour échapper le point d'interrogation comme @buckley suggère de ne faire l'affaire. @ssuukk Avez-vous essayé de s'échapper le point d'interrogation dans leurl
et pas leRegex
pattern
à la place?