2012-07-17 43 views
1

我试图从已标记为'@'的字符串中提取(可能用连字符)的单词。无声组无法在JavaScript正则表达式匹配()

因此,例如从字符串

var s = '@moo, @baa and @moo-baa are writing an email to [email protected]' 

我想回

['@moo', '@baa', '@moo-baa'] 

为了确保我不会捕捉到的电子邮件地址,我检查组前面有一个空格字符或行首:

s.match(/(^|\s)@(\w+[-\w+]*)/g) 

这似乎是做伎俩,但它也c aptures的空间,这是我不想:

["@moo", " @baa", " @moo-baa"] 

沉默分组这样

s.match(/(?:^|\s)@(\w+[-\w+]*)/g) 

似乎并没有工作,它会返回与之前相同的结果。我也尝试了相反的做法,并且检查了组前面没有\ w或\ S,但这也排除了该行的开头。我知道我可以简单地修剪空间,但我真的很希望只通过一次“匹配”呼叫就能完成这项工作。

有人有一个建议我做错了什么?提前感谢!

[编辑]

我也只注意到:为什么返回“@”符号,以及?我的意思是,这是我想要的,但为什么这样做呢?他们不在团队中,不是吗?

+1

我不知道这个问题的解决方案,只是想指出的是'\ w'不会与非拉丁字符的工作,所以它可能是不可靠的使用它。这里的信息http://blog.stevenlevithan.com/archives/javascript-regex-and-unicode – 2012-07-17 19:06:05

+0

@DmitryPashkevich:没关系,在这种情况下字符串仅限于拉丁字符。谢谢你的提醒! – HumanCatfood 2012-07-18 09:03:34

回答

2

据我所知,整个比赛从String.match使用“G”修改时返回。因为使用修饰符,您正在告诉函数匹配整个表达式,而不是从子表达式(组)中创建编号匹配。全局比赛不会返回组,而是组是比赛本身。

在你的情况,你要找的正则表达式可能是这样的:

'@moo, @baa and @moo-baa are writing an email to [email protected]'.match(/(?!\b)(@[\w\-]+)/g); 

您正在寻找不遵循一个字边界的每一个“@”符号。所以不需要沉默的团体。

+0

是的,完美的作品,谢谢! – HumanCatfood 2012-07-18 09:14:57

1

如果你不想要捕获的空间,不要把\s内的括号。括号内的任何内容都将作为捕获组的一部分返回。

+0

您的意思是?匹配(/^| \ s @(\ w + [ - \ w +] *)/ g)仍然返回空格,并且不会捕获行中的第一个匹配项。虽然谢谢! – HumanCatfood 2012-07-18 09:14:33