Regex Java para extraer texto entre tags

Tengo un archivo con algunas tags personalizadas y me gustaría escribir una expresión regular para extraer la cadena entre las tags. Por ejemplo, si mi etiqueta es:

[customtag]String I want to extract[/customtag] 

¿Cómo escribiría una expresión regular para extraer solo la cadena entre las tags? Este código parece un paso en la dirección correcta:

 Pattern p = Pattern.compile("[customtag](.+?)[/customtag]"); Matcher m = p.matcher("[customtag]String I want to extract[/customtag]"); 

No estás seguro de qué hacer después. ¿Algunas ideas? Gracias.

Estás en el camino correcto. Ahora solo necesita extraer el grupo deseado, de la siguiente manera:

 final Pattern pattern = Pattern.compile("(.+?)"); final Matcher matcher = pattern.matcher("String I want to extract"); matcher.find(); System.out.println(matcher.group(1)); // Prints String I want to extract 

Si desea extraer múltiples visitas, intente esto:

 public static void main(String[] args) { final String str = "applehelloorangepear"; System.out.println(Arrays.toString(getTagValues(str).toArray())); // Prints [apple, orange, pear] } private static final Pattern TAG_REGEX = Pattern.compile("(.+?)"); private static List getTagValues(final String str) { final List tagValues = new ArrayList(); final Matcher matcher = TAG_REGEX.matcher(str); while (matcher.find()) { tagValues.add(matcher.group(1)); } return tagValues; } 

Sin embargo, estoy de acuerdo en que las expresiones regulares no son la mejor respuesta aquí. Usaría XPath para encontrar los elementos que me interesan. Consulte la API Java XPath para obtener más información.

Para ser honesto, las expresiones regulares no son la mejor idea para este tipo de análisis sintáctico. La expresión regular que publicó probablemente funcionará muy bien para casos simples, pero si las cosas se vuelven más complejas, tendrá enormes problemas (la misma razón por la que no puede analizar HTML de manera confiable con expresiones regulares). Sé que probablemente no quieras escuchar esto, sé que no lo hice cuando hice el mismo tipo de preguntas, pero el análisis de cadenas se hizo MÁS confiable para mí después de que dejé de intentar usar expresiones regulares para todo.

jTopas es un tokenizador INCREÍBLE que hace que sea bastante fácil escribir analizadores a mano (ESFUERZO sugiero jtopas sobre las bibliotecas de escáner java estándar / etc.). Si quieres ver jtopas en acción, aquí hay algunos analizadores que escribí usando jTopas para analizar este tipo de archivo

Si está analizando archivos XML, debe usar una biblioteca de analizador xml. No lo hagas a menos que solo lo hagas por diversión, hay muchas opciones probadas por ahí

Un enfoque genérico, más simple y un poco primitivo para encontrar la etiqueta, el atributo y el valor

  Pattern pattern = Pattern.compile("<(\\w+)( +.+)*>((.*))"); System.out.println(pattern.matcher(" TEST").find()); System.out.println(pattern.matcher("").find()); System.out.println(pattern.matcher(" TEST").find()); System.out.println(pattern.matcher(" TESTasd>").find()); System.out.println("-------"); Matcher matcher = pattern.matcher(" TEST"); if (matcher.find()) { for (int i = 0; i < matcher.groupCount(); i++) { System.out.println(i + ":" + matcher.group(i)); } } 
  final Pattern pattern = Pattern.compile("tag\\](.+?)\\[/tag"); final Matcher matcher = pattern.matcher("[tag]String I want to extract[/tag]"); matcher.find(); System.out.println(matcher.group(1)); 

Prueba esto:

 Pattern p = Pattern.compile(?<=\\<(any_tag)\\>)(\\s*.*\\s*)(?=\\<\\/(any_tag)\\>); Matcher m = p.matcher(anyString); 

Por ejemplo:

 String str = " 1Q Ene 3.08% "; Pattern p = Pattern.compile("(?<=\\)(\\s*.*\\s*)(?=\\<\\/TD\\>)"); Matcher m = p.matcher(str); while(m.find()){ Log.e("Regex"," Regex result: " + m.group()) } 

Salida:

10 Ene

3.08%

Prefijo esta respuesta con “no debe usar una expresión regular para analizar XML: solo va a dar como resultado casos extremos que no funcionan correctamente y una expresión regular que aumenta para siempre en la complejidad mientras intenta solucionarlo ”

Una vez dicho esto, debe proceder haciendo coincidir la cadena y tomando el grupo que desea:

 if (m.matches()) { String result = m.group(1); // do something with result } 
  String s = "TestTest1"; String pattern ="\\<(.+)\\>([^\\<\\>]+)\\<\\/\\1\\>"; int count = 0; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(s); while(m.find()) { System.out.println(m.group(2)); count++; }