2 Stimmen

RegExp, um Wörter in geschweiften Klammern zu finden

In Javascript habe ich einen HTML-Block wie diesen:

<h2>{title}</h2>
<p><a href="{url}">{content}</a></p>

Und ich versuche, Regex "Match" zu verwenden, um ein Array aller {item}'s auszuspucken. Meine Ausgabe sollte also so aussehen:

['title', 'url', 'content']

Ich bin schon so weit gekommen:

var pattern = new RegExp("\{[a-zA-Z]+\}+");
var match = pattern.exec("{Sample} bob {text}");

Aber es wird nur der erste Tag zurückgegeben.

Das übersteigt einfach meine Regex-Kenntnisse. Kann jemand helfen?

Zum Wohl!

7voto

Jan Goyvaerts Punkte 20683

Sie müssen ein Muster mit dem globalen Flag erstellen:

var pattern = new RegExp("\{[a-zA-Z]+\}", "g");

oder:

var pattern = /\{[a-zA-Z]+\}/g;

Dann können Sie die Methode match() für Ihre Zeichenkette aufrufen, um eine Liste von Übereinstimmungen zu erhalten:

var matches = "{Sample} bob {text}".match(pattern);

0 Stimmen

Ich denke, "\{[^}]+\}" ist sicherer als "\{[a-zA-Z]\}", aber wenn es keine anderen Buchstaben/Symbole in Coreys Modell gibt, ist es wohl okay. +1

0 Stimmen

Ganz und gar nicht. Corey selbst verwendete [a-zA-Z], also habe ich das beibehalten. Eine Regex sollte immer so streng wie möglich sein, niemals so locker wie möglich. Wenn Corey eines Tages eine HTML-Datei mit einem fehlenden } hat, wird [^}]+ verrückt spielen, während [a-zA-Z] es nicht tut.

2voto

grieve Punkte 12440

Ich glaube, Sie wollen:

var pattern = new RegExp("\{[a-zA-Z]+\}+", "g");

Die zweite Option ist ein Flag, das die gesamte Zeichenkette durchsucht und alle Treffer zurückgibt.

Siehe: http://www.evolt.org/article/Regular_Expressions_in_JavaScript/17/36435/ für weitere Einzelheiten.

1voto

dlamblin Punkte 42420

Auch wenn ich gerne meine eigenen RegExp einsetze (und Sie wirklich nur das globale Flag brauchen), haben Sie sich die Prototyp-Vorlagen , Trimpath JST oder etwas Ähnliches?

Denn möglicherweise ist die Wiederverwendung nicht so effizient wie bei den oben genannten Beispielen. 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."

Dies führt Ihre Regex jedes Mal, während ich glaube, der Prototyp Vorlagen im Grunde tut es einmal.

1voto

Kristof Neirynck Punkte 3403

Haben Sie das schon ausprobiert?

<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>

0voto

Corey Punkte 1957

Ich bin vom Weg abgekommen, indem ich exec zu testen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X