Regex Java – coincidencias superpuestas

En el siguiente código:

public static void main(String[] args) { List allMatches = new ArrayList(); Matcher m = Pattern.compile("\\d+\\D+\\d+").matcher("2abc3abc4abc5"); while (m.find()) { allMatches.add(m.group()); } String[] res = allMatches.toArray(new String[0]); System.out.println(Arrays.toString(res)); } 

El resultado es:

 [2abc3, 4abc5] 

Me gustaría que fuera

 [2abc3, 3abc4, 4abc5] 

¿Cómo puede lograrse?

Haga que el emparejador intente iniciar su próximo escaneo desde este último \d+ .

 Matcher m = Pattern.compile("\\d+\\D+(\\d+)").matcher("2abc3abc4abc5"); if (m.find()) { do { allMatches.add(m.group()); } while (m.find(m.start(1))); } 

No estoy seguro si esto es posible en Java, pero en PCRE puedes hacer lo siguiente:
(?=(\d+\D+\d+)).

Explicación
La técnica consiste en utilizar un grupo coincidente en una búsqueda anticipada, y luego “comer” un personaje para avanzar.

  • (?= : inicio de lookahead positivo
    • ( : empieza el grupo coincidente 1
      • \d+ : concuerda un dígito una o más veces
      • \D+ : unir un carácter sin dígitos una o más veces
      • \d+ : concuerda un dígito una o más veces
    • ) : final del grupo 1
  • ) : fin de mirar hacia adelante
  • . : coincide con cualquier cosa, esto es para “avanzar”.

Demo en línea


Gracias a Casimir et Hippolyte realmente parece funcionar en Java. Solo necesita agregar barras diagonales inversas y mostrar el primer grupo de captura: (?=(\\d+\\D+\\d+)). . Probado en http://www.regexplanet.com :

enter image description here

La solución anterior de HamZa funciona perfectamente en Java. Si desea encontrar un patrón específico en un texto, todo lo que tiene que hacer es:

 String regex = "\d+\D+\d+"; String updatedRegex = "(?=(" + regex + "))."; 

Cuando la regex es el patrón que está buscando y se superpone, debe rodearlo con (?=(" at the start and ")). al final.