2014-05-02 52 views
0

正则表达式不是我的强项。我希望你们中的一位能帮助我。javascript匹配返回词边界

我想用javacript.match()搜索所有散列(#开头)的单词。 ,我得到一个返回的空白。

string = "#foo #bar" 
result = string.match(/(^|\W)(#[a-z\d][\w-]*)/ig); 
console.log(result) 

结果:

["#foo", " #bar"] 

通知在#bar空白。
我应该如何更改我的RegEx以排除返回到.match的边界?
感谢您的帮助!

回答

1

你以前不需要(^|\W)因为#无论如何都被认为是非单词字符。你正在获得空间,因为\W也将匹配空间。

这正则表达式将更好地工作:

var re = /(?:^|\s)(#[a-z\d][\w-]*)/g, 
    matches = [], 
    input = "#foo #bar abc#baz"; 
while (match = re.exec(input)) matches.push(match[1].trim()); 

console.log(matches); 
//=> ["#foo", "#bar"] 

编辑:为了避免循环:

var m = []; 
var str = "#foo #bar abc#baz"; 
str.replace(/(^|\s)(#[a-z\d][\w-]*)/g, function($1) { m.push($1.trim()); return $1; }); 

console.log(m); 
//=> ["#foo", "#bar"] 
+0

我编辑了原始问题以反映我正在寻找以散列开头的单词。你提供的正则表达式可以允许在一个单词中间加入散列。 – cs45977

+0

好吧现在查看编辑答案 – anubhava

0

您需要使用这个语法来提取捕获组:

var str = '#foo #bar'; 
var myRegexp = new RegExp('(?:^|\\W)(#[^\\W_][\\w-]*)', 'g'); 

var matchResult = myRegexp.exec(str); 
var result = Array(); 

while (matchResult != null) { 
    result.push(matchResult[1]); 
    matchResult = myRegexp.exec(str); 
} 

console.log(result); 

如果你不想遍历比赛结果,你可以使用这个技巧:

var str = '#foo #bar'; 
var result = Array(); 

str.replace(/(?:^|\W)(#[^\W_][\w-]*)/g, function (m, g1) { result.push(g1); }); 

console.log(result); 
+0

Humm,我本来想避免循环浏览结果。 感谢您的回复。 – cs45977

+0

@ cs45977:我不认为有另一种方式。或者也许使用替代方法与闭包作为替代。 –