2009-06-17 6 views
2

J'ai besoin de "saisir" un attribut d'une balise HTML personnalisée. Je sais que ce genre de question a déjà été posée à plusieurs reprises, mais regex me dérange vraiment et je n'arrive pas à le faire fonctionner.Comment modifier cette expression régulière pour extraire correctement les attributs de balise - devrait être simple

Un échantillon de XML que je dois travailler avec est

<!-- <editable name="nameValue"> --> - content goes here - <!-- </editable> -->

Je veux être en mesure de saisir la valeur de l'attribut name, qui dans ce cas est nameValue. Ce que j'ai est montré ci-dessous mais cela renvoie une valeur nulle.

Ma chaîne regex (pour une application Java, d'où le \ pour échapper à la «) est:
"(.)?<!-- <editable name=(\".*\")?> -->.*<!-- </editable> -->(.)?"

Je suis en train de saisir l'attribut avec guillemets je figure c'est le modèle le plus simple et le plus général à égaler. Eh bien, il ne fonctionne pas seulement, toute aide sera me aider à garder mes cheveux.

+0

Les commentaires HTML sont là pour une bonne raison. Je ne veux pas que le navigateur affiche les balises Ankur

Répondre

2

Je ne pense pas que vous avez besoin des (.)? s au début et à la fin de votre regex. Et vous devez mettre dans un groupe de capture pour obtenir seulement le contenu GOES-ici peu:

Cela a fonctionné pour moi:

String xml = "RANDOM STUFF<!-- <editable name=\"nameValue\"> --> - content goes here - <!-- </editable> -->RANDOM STUFF"; 
Pattern p = Pattern.compile("<!-- <editable name=(\".*\")?> -->(.*)<!-- </editable> -->"); 
Matcher m = p.matcher(xml); 
if (m.find()) { 
    System.out.println(m.group(2)); 
} else { 
    System.out.println("no match found"); 
} 

Cette impression:

- content goes here - 
2

Votre recherche est greedy. Utilisez "\<\!-- \<editable name=\"(.*?)\"\> --\>.*?\<\!-- \<\/editable\> --\>" (ajouté ?). S'il vous plaît noter que celui-ci ne fonctionnera pas correctement avec <editable> imbriqués des éléments.

Si vous ne voulez pas effectuer de vérification de la syntaxe, vous pouvez simplement utiliser: "\<\!-- \<editable name=\"(.*?)\"\> --\>" ou même "\<editable name=\"(.*?)\"\>" pour une meilleure simplicité et performance.

Edit: devrait être

Pattern re = Pattern.compile("\\<editable name=\"(.*?)\"\\>"); 
+0

Cela ne marche pas non plus. Quels sont les \ in dans \? \> - pourquoi échapperiez-vous au? et> caractères? – Ankur

+0

Parce que ces caractères peuvent être des caractères spéciaux dans une regex. Le ? est incorrect cependant, supprimé. Et en fait dans une chaîne Java, je devrais aussi échapper à la barre oblique inverse => \\>. –

+0

Correction de l'utilisation en Java. –

2

J'utilise JavaScript, mais il devrait aider à rendre l'expression non avide lorsque cela est possible et utiliser des allumettes et non au lieu de tout caractère correspond. Vous ne savez pas à quel point les expressions rationnelles sont similaires avec Java, mais au lieu d'utiliser l'expression \".*\", essayez d'utiliser \"[^\"]*\". Cela recherchera n'importe quel caractère dans la valeur d'attribut qui n'est pas une citation, ce qui signifie que l'expression ne peut pas correspondre au-delà de la valeur de l'attribut.

espoir qui aide

+1

+1 pour l'approche sans guillemets. Pour votre information, les expressions rationnelles Java peuvent faire tout ce que la saveur JavaScript peut apporter, et bien plus encore. –

+0

Merci. Oui, je sais que les regex de Javascript manquent dans certaines zones, par exemple. J'espère que cela va s'améliorer à temps. –

Questions connexes