¿Puede alguien explicar:grupos de Java Matcher: Entender la diferencia entre "(?: X | Y)" y "(: X?) | (:? Y)"
- Por qué los dos patrones utilizados por debajo dar diferentes resultados? (Contestado a continuación)
- Por qué el segundo ejemplo proporciona un recuento de grupo de 1 pero dice que el inicio y el final de grupo 1 es -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);
}
}
que da el siguiente resultado:
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
Gracias por esta respuesta. Todavía me gustaría entender por qué el recuento de grupos es 1. Comprendí (de la documentación y otros experimentos) que un recuento grupal de 1 debería significar que se había encontrado un solo grupo numerado y, por lo tanto, comenzar (1) debería ser> - 1. – user358795
El recuento de grupos se gana simplemente contando los paréntesis de agrupación, y su patrón tiene exactamente uno: '(. *)'. Este es el grupo 1. Si un grupo específico coincide con una entrada dada, es irrelevante para esa definición. Por ejemplo, en el patrón '" (Sí) | (No) "', hay dos grupos ("(Sí)" es el grupo 1, "(No)" es el grupo 2), pero solo uno de ellos puede coincidir con cualquier entrada dada. –
Lo que dices es que la documentación dice "Devuelve el número de grupos de captura en el patrón de este emparejador". significa el conteo en la expresión incluso si no hay coincidencia? En ese caso, ¿por qué la llamada a find() devuelve true? O para decirlo de otra manera, ¿cómo se pretende determinar si algún grupo coincide y, de ser así, cuántos? – user358795