这个正则表达式出了什么问题:/(?:(?:^ | \ s)hide _([^ \ s] +))+ /?

时间:2014-02-18 15:44:39

标签: javascript regex

这是我的正则表达式:

/(?:(?:^|\s)hide_([^\s]+))+/

例如,当我有这个字符串时:

 hide_test sgadsg hide_ asdg hide_some_more asdgasd

它应与testsome_more匹配。目前,它会返回hide_testtest。有没有人知道这个正则表达式有什么问题?

2 个答案:

答案 0 :(得分:3)

没有g标志,它只返回第一个匹配。

'hide_test sgadsg hide_ asdg hide_some_more asdgasd'.match(
    /(?:(?:^|\s)hide_([^\s]+))+/
)
// => ["hide_test", "test"]

设置g标志将为您提供所有匹配项(所有匹配的字符串):

'hide_test sgadsg hide_ asdg hide_some_more asdgasd'.match(
    /(?:(?:^|\s)hide_([^\s]+))+/g
)
// => ["hide_test", " hide_some_more"]

要仅获取hide_之后的部分,您需要对返回值进行后处理。

例如,使用map进行额外替换:

'hide_test sgadsg hide_ asdg hide_some_more asdgasd'.match(
    /(?:(?:^|\s)hide_([^\s]+))+/g
).map(function(match) {
    return match.replace(/^\s*hide_/, '');
})
顺便说一句,正则表达式可以简化为:/(\bhide_\S+)+/g(忽略捕获)

答案 1 :(得分:2)

如果您想要输出testsome_more,则需要使用.exec和循环:

var regex = /(?:\bhide_(\S+))+/g;
var s = 'hide_test sgadsg hide_ asdg hide_some_more asdgasd';
var match, matches=[];

while ( (match=regex.exec(s)) !== null ) {
    matches.push(match[1]);
}

alert(matches);

我也改变了你的正则表达式以简化它。