L' compile()
méthode est toujours appelé à un certain point; c'est la seule façon de créer un Modèle objet. Donc, la question est vraiment, pourquoi devriez-vous appeler explicitement? Une des raisons est que vous avez besoin d'une référence à la Correspondance de l'objet de sorte que vous pouvez utiliser ses méthodes, comme group(int)
pour récupérer le contenu de la capture de groupes. La seule façon d'obtenir ahold de la Correspondance de l'objet est à travers le Modèle de l'objet matcher()
méthode, et la seule façon de m'approprier le Modèle objet est par le biais de l' compile()
méthode. Puis il y a l' find()
méthode qui, à la différence matches()
, n'est pas reproduit dans la Chaîne ou le Modèle de classes.
L'autre raison est d'éviter de créer le même Modèle objet. Chaque fois que vous utilisez l'un des regex alimenté méthodes de Chaîne (ou la statique matches()
méthode dans le Modèle), il crée un nouveau Modèle et une nouvelle Matcher. Donc ce bout de code:
for (String s : myStringList) {
if ( s.matches("\\d+") ) {
doSomething();
}
}
...est exactement équivalent à ceci:
for (String s : myStringList) {
if ( Pattern.compile("\\d+").matcher(s).matches() ) {
doSomething();
}
}
Évidemment, ça fait beaucoup de travail inutile. En fait, il peut facilement prendre plus de temps pour compiler les regex et instancier le Modèle de l'objet, qu'il n'en faut pour effectuer une véritable match. De sorte qu'il est souvent logique à tirer de cette étape de la boucle. Vous pouvez créer le Comparateur de venir de temps en tant que bien, mais ils ne sont pas près si cher:
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("");
for (String s : myStringList) {
if ( m.reset(s).matches() ) {
doSomething();
}
}
Si vous êtes familier avec .NET regexes, vous demandez peut-être si Java est compile()
méthode est de .NET RegexOptions.Compiled
modificateur; la réponse est non. Java Pattern.compile()
méthode est simplement l'équivalent .NET de la Regex constructeur. Lorsque vous spécifiez l' Compiled
option:
Regex r = new Regex(@"\d+", RegexOptions.Compiled);
...il compile les regex directement à CIL de byte code, lui permettant de réaliser beaucoup plus rapidement, mais à un coût important dans le traitement et l'utilisation de la mémoire--penser que les stéroïdes pour les regexes. Java n'a pas d'équivalent; il n'y a pas de différence entre un Patron qui a créé les coulisses en String#matches(String)
et celui que vous créez explicitement Pattern#compile(String)
.
(EDIT: j'ai d'abord dit que tous les .NET Regex objets sont mis en cache, ce qui est incorrect. Depuis .NET 2.0, la mise en cache automatique se produit uniquement avec des méthodes statiques comme Regex.Matches()
, pas lorsque vous appelez une Regex constructeur directement. réf)