没有为多个匹配重复调用正则表达式(不是全局的)

时间:2015-02-07 23:33:24

标签: javascript regex

我有这个正则表达式/@[a-zA-Z0-9_]+$/g来全局查找所提到的所有用户名。

以下是一些示例代码。

var userRegex = /@[a-zA-Z0-9_]+$/g;
var text = "This is some sample text @Stuff @Stuff2 @Stuff3";
text.replace(userRegex, function(match, text, urlId) {
    console.log(match);
});

基本上console.log只会被调用一次,在这种情况下,它只会显示@Stuff3。我不确定为什么它不是全球搜索。如果有人可以帮我修复那个正则表达式,那真是棒极了!

3 个答案:

答案 0 :(得分:3)

$表示“断言字符串末尾的位置(或在字符串末尾的换行符之前,如果有的话)”。但你似乎不想那样。

请删除$并改为使用/@[a-zA-Z0-9_]+/g

var userRegex = /@[a-zA-Z0-9_]+/g,
    text = "This is some sample text @Stuff @Stuff2 @Stuff3";
text.match(userRegex); // [ "@Stuff", "@Stuff2", "@Stuff3" ]

答案 1 :(得分:2)

它不是在整个上下文中进行全局搜索,仅仅是因为字符串$的结束(仅在字符串位置的末尾声明)。您可以在此处使用以下内容:

var results = text.match(/@\w+/g) //=> [ '@Stuff', '@Stuff2', '@Stuff3' ]

注意: \w是匹配任何字词的简写。

答案 2 :(得分:0)

添加@Oriol的回答。您可以添加单词边界以使其更具体。

@([a-zA-Z0-9_]+)\b

\b只会在用户名后跟非字字符时才会匹配。

这是regex demo