J'essaye de comprendre ce bloc de code. Dans le premier, que recherchons-nous dans l'expression?
Je crois comprendre qu'il s'agit de n'importe quel caractère (0 fois ou plus *) suivi de n'importe quel nombre entre 0 et 9 (une ou plusieurs fois +) suivi de n'importe quel caractère (0 fois ou plus *).
Quand ceci est exécuté, le résultat est:
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
Quelqu'un pourrait-il passer par là avec moi?
Quel est l'avantage d'utiliser des groupes de capture?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTut3 {
public static void main(String args[]) {
String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find()) {
System.out.println("Found value: " + m.group(0));
System.out.println("Found value: " + m.group(1));
System.out.println("Found value: " + m.group(2));
} else {
System.out.println("NO MATCH");
}
}
}
Réponses:
Le problème que vous rencontrez concerne le type de quantificateur. Vous utilisez un quantificateur gourmand dans votre premier groupe (index 1 - index 0 représente le tout
Pattern
), ce qui signifie qu'il correspondra autant que possible (et comme il s'agit de n'importe quel caractère, il correspondra à autant de caractères qu'il y a afin de remplir la condition pour les groupes suivants).En bref, votre premier groupe
.*
correspond à n'importe quoi tant que le groupe suivant\\d+
peut correspondre à quelque chose (dans ce cas, le dernier chiffre).Selon le 3ème groupe, il correspondra à tout ce qui se trouve après le dernier chiffre.
Si vous le changez en quantificateur réticent dans votre premier groupe, vous obtiendrez le résultat que je suppose que vous attendez, c'est-à-dire la partie 3000 .
Notez le point d' interrogation dans le 1er groupe.
Production:
Plus d'informations sur Java
Pattern
ici .Enfin, les groupes de capture sont délimités par des crochets et fournissent un moyen très utile d'utiliser des références arrière (entre autres), une fois que votre
Pattern
correspond à l'entrée.En Java 6, les groupes ne peuvent être référencés que par leur ordre (attention aux groupes imbriqués et à la subtilité de l'ordre).
Dans Java 7, c'est beaucoup plus facile, car vous pouvez utiliser des groupes nommés.
la source
named-regexp
.C'est tout à fait correct.
m.group(0)
) capture toujours toute la zone couverte par votre expression régulière . Dans ce cas, c'est la chaîne entière.(.*)(\\d+)
(la première partie de votre regex) couvre l'...QT300
int le premier groupe et le0
dans le second.(.*)
à(.*?)
.Pour plus d'informations sur gourmand ou paresseux, consultez ce site.
la source
Du doc:
Le groupe de capture 0 envoie donc toute la ligne.
la source
Votre compréhension est correcte. Cependant, si nous parcourons:
(.*)
avalera toute la chaîne;(\\d+)
soit satisfait (c'est pourquoi il0
est capturé, et non3000
);(.*)
capturera alors le reste.Cependant, je ne sais pas quelle était l'intention initiale de l'auteur.
la source