Me he encontrado con este problema Hackerrank y la expresión regular debe coincidir con cuerda entre las etiquetas HTML. La expresión regular y la cadena es
String str="<h1>Hello World!</h1>";
String regex="<(.+)>([^<]+)</\\1>";
También lo que si el 'str' tiene más de un etiquetas HTML como String str="<h1><h1>Hello World!</h1></h1>"
y cómo ([^<]+)
las capturas de este 'str'.
Mi pregunta es ¿cómo ([^<]+)
coincide con el 'str' y no ([a-zA-Z]+)
.
Aquí si el código fuente completo:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/* Solution assumes we can't have the symbol "<" as text between tags */
public class Solution{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int testCases = Integer.parseInt(scan.nextLine());
while (testCases-- > 0) {
String line = scan.nextLine();
boolean matchFound = false;
Pattern r = Pattern.compile(regex);
Matcher m = r.matcher(line);
while (m.find()) {
System.out.println(m.group(2));
matchFound = true;
}
if ( ! matchFound) {
System.out.println("None");
}
}
}
}
No importa si soy tonto para hacer esta pregunta y gracias por adelantado!
Este expresiones regulares garantiza que la cadena sólo contiene una etiqueta, en el supuesto de entrada HTML bien formado.
Las primeras <(.+)>
capturas el nombre de su etiqueta. El grupo de captura también recibirá atributos que pueda. Dado que +
es un cuantificador codiciosos, capturará varias etiquetas si se puede.
Los arrastran </\\1>
partidos contra lo capturó el primer grupo. Por eso, si su código HTML está bien formado, la expresión no capturar múltiples tags o etiquetas con atributos:
- Etiqueta de apertura
<h1>
, el cierre de la etiqueta</h1>
✓ - Etiqueta de apertura
<h1 attr="value">
, de cierre del marcador</h1>
, pero esperando</h1 attr="value">
- Etiqueta de apertura
<h1><h2>
, de cierre del marcador</h2></h1>
, pero esperando</h1><h2>
Es por eso que la etiqueta puede ser matche con .+
bastante seguridad, mientras que los contenidos deben coincidir con [^<]+
. Usted quiere asegurarse de que no agarra cualquier etiqueta de estancia en el contenido, pero se permite cualquier otro carácter. [^<]+
(pronunciado. "No <
, al menos una vez) permite cosas como !
, aunque [A-za-z]
sin duda no lo haría.