Quelqu'un peut-il expliquer:groupes Java Matcher: Comprendre la différence entre "(: X | Y)" et "(X?) | (: Y)"
- Pourquoi les deux modèles utilisés ci-dessous donner des résultats différents? (répondu ci-dessous)
- Pourquoi le 2ème exemple donne un compte de groupe de 1 mais indique le début et la fin du groupe 1 est -1?
public void testGroups() throws Exception
{
String TEST_STRING = "After Yes is group 1 End";
{
Pattern p;
Matcher m;
String pattern="(?:Yes|No)(.*)End";
p=Pattern.compile(pattern);
m=p.matcher(TEST_STRING);
boolean f=m.find();
int count=m.groupCount();
int start=m.start(1);
int end=m.end(1);
System.out.println("Pattern=" + pattern + "\t Found=" + f + " Group count=" + count +
" Start of group 1=" + start + " End of group 1=" + end);
}
{
Pattern p;
Matcher m;
String pattern="(?:Yes)|(?:No)(.*)End";
p=Pattern.compile(pattern);
m=p.matcher(TEST_STRING);
boolean f=m.find();
int count=m.groupCount();
int start=m.start(1);
int end=m.end(1);
System.out.println("Pattern=" + pattern + "\t Found=" + f + " Group count=" + count +
" Start of group 1=" + start + " End of group 1=" + end);
}
}
qui donne le résultat suivant:
Pattern=(?:Yes|No)(.*)End Found=true Group count=1 Start of group 1=9 End of group 1=21
Pattern=(?:Yes)|(?:No)(.*)End Found=true Group count=1 Start of group 1=-1 End of group 1=-1
Merci pour cette réponse. Je voudrais toujours comprendre pourquoi le compte de groupe est 1. J'ai compris (de la documentation et d'autres expériences) qu'un compte de groupe de 1 devrait signifier qu'un seul groupe numéroté a été trouvé et donc commencer (1) devrait être> - 1. – user358795
Le nombre de groupes est obtenu uniquement en comptant les parenthèses de regroupement, et votre modèle en a exactement un: '(. *)'. C'est le groupe 1. Si un groupe spécifique correspond à une entrée donnée, n'est pas pertinent pour cette définition. Par exemple, dans le modèle '" (Oui) | (Non) "', il y a deux groupes ("(Oui)" est le groupe 1, "(Non)" est le groupe 2), mais un seul peut correspondre donnée donnée. –
Donc vous dites que là où la documentation dit "Renvoie le nombre de groupes de capture dans le modèle de ce matcher". cela signifie le compte dans l'expression même s'il n'y a pas de correspondance? Dans ce cas, pourquoi l'appel de find() retourne-t-il vrai? Ou, pour le dire autrement, comment est-ce qu'on a l'intention de déterminer si des groupes ont correspondu et si oui, combien? – user358795