1

我正在尝试从标有“@”的字符串中提取(可能连字符)单词。

所以例如从字符串

var s = '@moo, @baa and @moo-baa are writing an email to a@bc.de'

我想回来

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

为了确保我没有捕获电子邮件地址,我检查了该组前面是否有一个空格字符或行的开头:

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

这似乎可以解决问题,但它也捕获了我不想要的空间:

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

像这样使分组静音

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

似乎不起作用,它返回与以前相同的结果。我也尝试了相反的方法,并检查了该组前面是否没有 \w 或 \S ,但这也排除了该行的开头。我知道我可以简单地修剪空格,但我真的很想通过一个“匹配”调用来完成这个工作。

有人建议我做错了什么吗?非常感谢提前!!

[编辑]

我也刚刚注意到:为什么它也会返回“@”符号?!我的意思是,这就是我想要的,但它为什么要这样做呢?他们不在团体之外,不是吗?

4

2 回答 2

2

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

在您的情况下,您正在寻找的正则表达式可能是这样的:

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

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

于 2012-07-17T23:01:28.713 回答
1

如果不想占用空格,就不要放在\s括号里面。括号内的任何内容都将作为捕获组的一部分返回。

于 2012-07-17T18:28:22.367 回答