Extrae cuerda entre dos cuerdas en java

Intento obtener una cadena entre , aquí está mi implementación:

String str = "ZZZZL  AFFF "; Pattern pattern = Pattern.compile(""); String[] result = pattern.split(str); System.out.println(Arrays.toString(result)); 

vuelve

 [ZZZZL , AFFF ] 

Pero mi expectativa es:

 [ dsn , AFG ] 

¿Dónde estoy equivocado y cómo corregirlo?

Tu patrón está bien. Pero no debe split() , debe find() . El siguiente código da el resultado que está buscando:

 String str = "ZZZZL <%= dsn %> AFFF <%= AFG %>"; Pattern pattern = Pattern.compile("<%=(.*?)%>"); Matcher matcher = pattern.matcher(str); while (matcher.find()) { System.out.println(matcher.group(1)); } 

He respondido esta pregunta aquí: https://stackoverflow.com/a/38238785/1773972

Básicamente uso

 StringUtils.substringBetween(str, "<%=", "%>"); 

Esto requiere el uso de la biblioteca “Apache commons lang”: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

Esta biblioteca tiene muchos métodos útiles para trabajar con cadenas, ¡realmente te beneficiarás al explorar esta biblioteca en otras áreas de tu código Java!

Su expresión regular parece correcta, pero se está splitting con ella en lugar de matching con ella. Quieres algo como esto:

 // Untested code Matcher matcher = Pattern.compile("<%=(.*?)%>").matcher(str); while (matcher.find()) { System.out.println(matcher.group()); } 

El enfoque de Jlordo cubre una situación específica. Si tratas de construir un método abstracto a partir de él, puedes enfrentar una dificultad para verificar si ‘ textFrom ‘ está antes de ‘ textTo ‘. De lo contrario, el método puede devolver una coincidencia para alguna otra ocurrencia de ‘ textFrom ‘ en el texto.

Aquí hay un método abstracto listo para usar que cubre esta desventaja:

  /** * Get text between two strings. Passed limiting strings are not * included into result. * * @param text Text to search in. * @param textFrom Text to start cutting from (exclusive). * @param textTo Text to stop cuutting at (exclusive). */ public static String getBetweenStrings( String text, String textFrom, String textTo) { String result = ""; // Cut the beginning of the text to not occasionally meet a // 'textTo' value in it: result = text.substring( text.indexOf(textFrom) + textFrom.length(), text.length()); // Cut the excessive ending of the text: result = result.substring( 0, result.indexOf(textTo)); return result; }