RegExp, чтобы соответствовать словам, заключенным в фигурные скобки - PullRequest
2 голосов
/ 17 ноября 2008

В JavaScript у меня есть блок HTML, подобный этому:

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

И я пытаюсь использовать регулярное выражение "match", чтобы выложить массив всех {item}. Поэтому мой вывод должен выглядеть так:

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

Я дошел до:

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

Но он возвращает только первый тег.

Это просто за пределами моих навыков регулярных выражений. Кто-нибудь может помочь?

Ура!

Ответы [ 5 ]

7 голосов
/ 17 ноября 2008

Вам необходимо создать шаблон с глобальным флагом:

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

или

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

Затем вы можете вызвать метод match () для вашей строки, чтобы получить список совпадений:

var matches = "{Sample} bob {text}".match(pattern);
2 голосов
/ 17 ноября 2008

Я думаю, что вы хотите:

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

Второй вариант - флаг, указывающий, что нужно искать всю строку и возвращать все совпадения.

Подробнее см. http://www.evolt.org/article/Regular_Expressions_in_JavaScript/17/36435/.

1 голос
/ 17 ноября 2008

Вы уже пробовали это?

<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>
1 голос
/ 17 ноября 2008

Как бы мне не хотелось бросать свой собственный RegExp (а вам действительно нужен глобальный флаг), вы смотрели на шаблоны прототипов , Trimpath JST или что-то в этом роде?

Потому что, возможно, сворачивание собственного не будет таким же эффективным для повторного использования, как в приведенных выше примерах. 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."

Это запускает ваше регулярное выражение каждый раз, хотя я считаю, что шаблоны-прототипы в основном делают это один раз.

0 голосов
/ 17 ноября 2008

Я сбился с пути, используя exec для тестирования.

...