J'ai ce code, et je veux savoir, si je peux remplacer uniquement des groupes (pas tous les modèles) dans Java regex. Code:
//...
Pattern p = Pattern.compile("(\\d).*(\\d)");
String input = "6 example input 4";
Matcher m = p.matcher(input);
if (m.find()) {
//Now I want replace group one ( (\\d) ) with number
//and group two (too (\\d) ) with 1, but I don't know how.
}
java
regex
replace
regex-group
Wokena
la source
la source
Réponses:
Utilisez
$n
(où n est un chiffre) pour faire référence aux sous-séquences capturées dansreplaceFirst(...)
. Je suppose que vous vouliez remplacer le premier groupe par la chaîne littérale "nombre" et le deuxième groupe par la valeur du premier groupe.Considérez
(\D+)
pour le deuxième groupe au lieu de(.*)
.*
est un matcher gourmand, et consommera d'abord le dernier chiffre. Le matcher devra alors revenir en arrière lorsqu'il se rendra compte que la finale(\d)
n'a rien à correspondre, avant de pouvoir correspondre au dernier chiffre.la source
m.replaceFirst("number $2$1");
devrait êtrem.replaceFirst("number $3$1");
Vous pouvez utiliser
Matcher#start(group)
etMatcher#end(group)
pour créer une méthode de remplacement générique:Consultez la démo en ligne ici .
la source
Désolé de battre un cheval mort, mais c'est un peu bizarre que personne ne l'ait signalé - "Oui, vous pouvez, mais c'est le contraire de la façon dont vous utilisez la capture de groupes dans la vraie vie".
Si vous utilisez Regex comme il est censé être utilisé, la solution est aussi simple que ceci:
Ou comme indiqué à juste titre par shmosel ci-dessous,
... car dans votre regex il n'y a aucune bonne raison de regrouper les décimales du tout.
Vous n'utilisez généralement pas de groupes de capture sur les parties de la chaîne que vous souhaitez supprimer , vous les utilisez sur la partie de la chaîne que vous souhaitez conserver .
Si vous voulez vraiment des groupes que vous souhaitez remplacer, ce que vous voulez probablement à la place est un moteur de création de modèles (par exemple, moustache, ejs, StringTemplate, ...).
En aparté pour les curieux, même les groupes non capturants dans les regex sont juste là pour le cas où le moteur de regex en a besoin pour reconnaître et ignorer le texte variable. Par exemple, dans
vous en avez besoin si votre entrée peut ressembler à "abcabc capture me bcdbcd" ou "abc capture me bcd" ou même simplement "capture me".
Ou pour le dire autrement: si le texte est toujours le même et que vous ne le capturez pas, il n'y a aucune raison d'utiliser des groupes.
la source
\d(.*)\d
suffira.$11
ici. Pourquoi 11?Ajoutez un troisième groupe en ajoutant des parens autour
.*
, puis remplacez la sous-séquence par"number" + m.group(2) + "1"
. par exemple:la source
"number$21"
fonctionne et"number" + m.group(2) + "1"
ne fonctionne pas.number$21
remplacer le groupe 21, pas le groupe 2 + la chaîne «1».Vous pouvez utiliser les méthodes matcher.start () et matcher.end () pour obtenir les positions des groupes. Ainsi, en utilisant ces positions, vous pouvez facilement remplacer n'importe quel texte.
la source
remplacez les champs de mot de passe de l'entrée:
la source
Voici une solution différente, qui permet également le remplacement d'un seul groupe en plusieurs matchs. Il utilise des piles pour inverser l'ordre d'exécution, de sorte que l'opération de chaîne puisse être exécutée en toute sécurité.
la source