Je suis tombé sur ce problème HackerRank et la regex doit correspondre à la chaîne entre les balises HTML. La regex et la chaîne est
String str="<h1>Hello World!</h1>";
String regex="<(.+)>([^<]+)</\\1>";
Aussi si le « str » a plus d'un balises HTML comme String str="<h1><h1>Hello World!</h1></h1>"
et comment les ([^<]+)
prises cette « str ».
Ma question est de savoir comment ([^<]+)
correspond à la « str » et non ([a-zA-Z]+)
.
Ici, si le code source complet:
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");
}
}
}
}
Ne pas l'esprit si je suis stupide de poser cette question et je vous remercie à l'avance!
Cette regex garantit que votre chaîne ne contient qu'une seule étiquette, en supposant bien formé entrée HTML.
Les premières <(.+)>
captures le nom de votre balise. Le groupe de capture sera également obtenir des attributs qu'il peut. Depuis +
un quantificateur gourmand, il capture plusieurs balises si elle peut.
Les fuite </\\1>
matchs contre quel que soit le premier groupe capturé. Voilà pourquoi, si votre HTML est bien formé, l'expression ne sera pas capturer plusieurs balises ou tags avec des attributs:
- Balise d' ouverture
<h1>
, balise de fermeture</h1>
✓ - Balise d' ouverture
<h1 attr="value">
, balise de fermeture</h1>
, mais attend</h1 attr="value">
- Balise d' ouverture
<h1><h2>
, balise de fermeture</h2></h1>
, mais attend</h1><h2>
Voilà pourquoi la balise peut être Matche avec .+
plutôt en toute sécurité, alors que le contenu doit être assorti [^<]+
. Vous voulez vous assurer que vous ne prenez pas de balises séjour dans le contenu, mais tout autre caractère à tout est permis. [^<]+
(prononcé. « pas <
, au moins une fois) permet des choses comme !
, tout [A-za-z]
ne serait certainement pas.