RegEx pour faire correspondre les mots entourés d'accolades
-
08-07-2019 - |
Question
En javascript, j'ai un bloc HTML comme celui-ci:
<h2>{title}</h2>
<p><a href="{url}">{content}</a></p>
Et j'essaie d'utiliser regex " match " cracher un tableau de tous les {item}. Donc, ma sortie devrait ressembler à:
['title', 'url', 'content']
Je suis aussi loin que:
var pattern = new RegExp("\{[a-zA-Z]+\}+");
var match = pattern.exec("{Sample} bob {text}");
Mais il ne retourne que la première balise.
Ceci est juste au-delà de mes compétences regex. Quelqu'un peut-il aider?
Salut!
La solution
Vous devez créer un motif avec l'indicateur global:
var pattern = new RegExp("\{[a-zA-Z]+\}", "g");
ou:
var pattern = /\{[a-zA-Z]+\}/g;
Ensuite, vous pouvez appeler la méthode match () sur votre chaîne pour obtenir une liste de correspondances:
var matches = "{Sample} bob {text}".match(pattern);
Autres conseils
Je pense que vous voulez:
var pattern = new RegExp("\{[a-zA-Z]+\}+", "g");
La deuxième option est un drapeau lui demandant de rechercher toute la chaîne et de renvoyer toutes les correspondances.
Voir: http://www.evolt.org/article/Regular_Expressions_in_JavaScript/ 17/36435 / pour plus de détails.
Avez-vous déjà essayé ceci?
<script>
var text = '<h2>{title}</h2>\n<p><a href="{url}">{content}</a></p>';
var regex = /\{[a-z]+\}/ig;
var result = text.match(regex);
for (var i = 0; i < result.length; i++) {
console.debug(i + ". " + result[i]);
}
/*
gives:
0. {title}
1. {test}
2. {url}
3. {content}
*/
</script>
Même si j'aime bien lancer ma propre RegExp (et que vous avez vraiment besoin du drapeau global), avez-vous consulté modèles de prototype , JST Trimpath , ou quelque chose du genre. ?
Parce que rouler vous-même ne sera peut-être pas aussi efficace que les exemples ci-dessus. EG:
String.prototype.template = function (obj) {
return this.replace(/{([^{}]+)}/g,
function (full, word) {
return((typeof obj[word]==='string'||typeof obj[word]==='number')?obj[word]:full);
}
);
};
"The {adj1} {adj2} {noun}.".template({adj1: 'lazy',adj2: 'brown', noun: 'dog'})
==> "The lazy brown dog."
Ceci exécute votre expression rationnelle à chaque fois, alors que les modèles de prototype le font une fois.
J'ai quitté le chemin en utilisant exec
pour les tests.