RegEx匹配括在大括号中的单词

时间:2008-11-17 17:21:35

标签: javascript regex arrays templates match

在javascript中,我有一个像这样的HTML块:

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

我正在尝试使用正则表达式“匹配”来吐出所有{item}的数组。所以我的输出应该如下:

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

我已经达到了:

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

但它只返回第一个标签。

这超出了我的正则表达能力。有人可以帮忙吗?

干杯!

6 个答案:

答案 0 :(得分:7)

您需要使用全局标志创建模式:

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

或:

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

然后你可以在字符串上调用match()方法来获得匹配列表:

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

答案 1 :(得分:2)

我想你想要:

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

第二个选项是一个标志,告诉它搜索整个字符串并返回所有匹配。

有关详细信息,请参阅:http://www.evolt.org/article/Regular_Expressions_in_JavaScript/17/36435/

答案 2 :(得分:1)

就像我喜欢推出自己的RegExp(你真的只需要全局标志)一样,你看过prototype templatesTrimpath 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."

每次运行你的正则表达式,而我相信原型模板基本上只执行一次。

答案 3 :(得分:1)

你试过这个吗?

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

答案 4 :(得分:0)

@grieve - 很好的提示,它仍然只返回第一个。我会一直玩。

@litb - getElementsByTagName只会返回标签。我需要大括号中包含的自定义元素。 getElementsByTagName不会返回那些。正确?

答案 5 :(得分:0)

啊,哈哈!谢谢,Jan(和Grieve)。我想我已经开始使用exec进行测试了。