En Java, j'essaie de renvoyer toutes les correspondances regex dans un tableau mais il semble que vous ne puissiez vérifier si le modèle correspond à quelque chose ou non (booléen).
Comment puis-je utiliser une correspondance regex pour former un tableau de toutes les chaînes correspondant à une expression regex dans une chaîne donnée?
Réponses:
( La réponse de 4castle est meilleure que celle ci-dessous si vous pouvez supposer que Java> = 9)
Vous devez créer un matcher et l'utiliser pour rechercher des correspondances de manière itérative.
Après cela,
allMatches
contient les correspondances et vous pouvez utiliserallMatches.toArray(new String[0])
pour obtenir un tableau si vous en avez vraiment besoin.Vous pouvez également utiliser
MatchResult
pour écrire des fonctions d'assistance pour boucler les correspondances carMatcher.toMatchResult()
renvoie un instantané de l'état actuel du groupe.Par exemple, vous pouvez écrire un itérateur paresseux pour vous permettre de faire
en faisant quelque chose comme ça:
Avec ça,
rendements
la source
ArrayList
etLinkedList
, les résultats peuvent être surprenants.allMatches
vsyourStringHere.length()
), vous pouvez probablement précalculer une bonne taille pourallMatches
. D'après mon expérience, le coût de laLinkedList
mémoire et de l'efficacité des itérations n'en vaut généralement pas la peine, ceLinkedList
n'est donc pas ma posture par défaut. Mais lors de l'optimisation d'un hot-spot, il vaut vraiment la peine d'échanger les implémentations de liste pour voir si vous obtenez une amélioration.Matcher#results
pour obtenir unStream
que vous pouvez utiliser pour générer un tableau (voir ma réponse ).Dans Java 9, vous pouvez maintenant utiliser
Matcher#results()
pour obtenir unStream<MatchResult>
que vous pouvez utiliser pour obtenir une liste / un tableau de correspondances.la source
Java rend regex trop compliqué et ne suit pas le style perl. Jetez un œil à MentaRegex pour voir comment vous pouvez y parvenir en une seule ligne de code Java:
la source
Voici un exemple simple:
(si vous avez plus de groupes de capture, vous pouvez y faire référence par leur index comme argument de la méthode group. Si vous avez besoin d'un tableau, utilisez
list.toArray()
)la source
Pattern.matches()
est une méthode statique, vous ne devez pas l'appeler sur unePattern
instance.Pattern.matches(regex, input)
est simplement un raccourci pourPattern.compile(regex).matcher(input).matches()
.À partir des sentiers officiels Regex Java :
Utilisez
find
et insérez le résultatgroup
dans votre tableau / liste / peu importe.la source
la source