RegExp 匹配用大括号括起来的单词

RegExp to match words wrapped in braces

提问人:Corey 提问时间:11/18/2008 最后编辑:Fred GandtCorey 更新时间:6/7/2019 访问量:1461

问:

在 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}");

但它只返回第一个标签。

这超出了我的正则表达式技能。谁能帮忙?

干杯!

JavaScript 正则表达式 数组 模板 匹配

评论


答:

2赞 grieve 11/18/2008 #1

我想你想要:

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

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

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

7赞 Jan Goyvaerts 11/18/2008 #2

您需要创建一个带有全局标志的模式:

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

艺术

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

然后,您可以对字符串调用 match() 方法来获取匹配项列表:

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

评论

0赞 Tomalak 11/18/2008
我认为“\{[^}]+\}”比“\{[a-zA-Z]\}”更安全,但如果 Corey 的模型中没有其他字母/符号,我想没关系。+1
0赞 Jan Goyvaerts 11/20/2008
一点也不。科里自己用了[a-zA-Z],所以我保留了它。正则表达式应始终尽可能严格,而不是尽可能宽松。如果有一天 Corey 有一个缺少 } 的 HTML 文件,[^}]+ 将运行混乱,而 [a-zA-Z] 不会。
0赞 Corey 11/18/2008 #3

我通过用于测试而偏离了路径。exec

1赞 dlamblin 11/18/2008 #4

就像我喜欢滚动我自己的正则表达式一样(你真的只需要全局标志),你有没有看过原型模板Trimpath JST 或类似的东西?

因为可能滚动自己的重用效率不如上面的例子。例如:

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

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

1赞 Kristof Neirynck 11/18/2008 #5

你试过这个吗?

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