RegExp 用于匹配大括号中的单词

发布于 2024-07-08 16:10:14 字数 474 浏览 12 评论 0原文

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

但它只返回第一个标签。

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

干杯!

In javascript, I've got a block of HTML like this:

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

And I'm trying use regex "match" to spit out an array of all the {item}'s. So my output should look like:

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

I've gotten as far as:

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

But it's only returning the first tag.

This is just beyond my regex skills. Can anyone help?

Cheers!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

故事↓在人 2024-07-15 16:10:15

我想你想要:

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

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

请参阅:http://www.evolt.org/article/Regular_Expressions_in_JavaScript/17/36435 /了解更多详情。

I think you want:

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

The second option is a flag telling it to search the entire string and return all matches.

See: http://www.evolt.org/article/Regular_Expressions_in_JavaScript/17/36435/ for more details.

小清晰的声音 2024-07-15 16:10:15

你试过这个了吗?

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

Have you tried this yet?

<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>
陌路终见情 2024-07-15 16:10:15

就像我喜欢推出自己的正则表达式(并且您实际上只需要全局标志)一样,您是否看过 原型模板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."

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

Much as I like to roll my own RegExp (and you really just need the global flag), have you looked at prototype templates, Trimpath JST or anything like that?

Because possibly rolling your own won't be as efficient for reuse as the above examples. 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."

This runs your regex each time, while I believe the prototype templates basically does it once.

似狗非友 2024-07-15 16:10:15

我通过使用 exec 进行测试而偏离了道路。

I got off path by using exec for testing.

她如夕阳 2024-07-15 16:10:14

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

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

或:

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

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

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

You need to create a pattern with the global flag:

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

or:

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

Then you can call the match() method on your string to get a list of matches:

var matches = "{Sample} bob {text}".match(pattern);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文