提问人:Corey 提问时间:11/18/2008 最后编辑:Fred GandtCorey 更新时间:6/7/2019 访问量:1461
RegExp 匹配用大括号括起来的单词
RegExp to match words wrapped in braces
问:
在 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}");
但它只返回第一个标签。
这超出了我的正则表达式技能。谁能帮忙?
干杯!
答:
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>
评论