为什么这个@mention正则表达式不起作用?

时间:2014-02-19 18:37:49

标签: javascript regex

所以我有这个正则表达式

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

这错误地给了我提到之前的时期 - 例如

.@blah.

先前的句号匹配并被捕获。

此外,当我这样做时 -

句末。@ foo。句子的开头

它捕获.@foo.Start

当我希望它只捕获@foo

当我有这个正则表达式时 -

/(?:\s|^)@(\w+\.?(?:\w+))/g

外,所有案件都有效
.@foo. and End of sentence.@foo.Start of sentence

在这些情况下,没有任何匹配。

我应该如何更改此正则表达式?

代码(虽然我不确定为什么这会有所帮助)

text.replace(/(?:\s|^)@(\w+\.?(?:\w+))/g, function(match, p1) {
            var text = match,
                link = '/' + $.trim(text).slice(1);
            return '<a href="' + link + '" target="_blank">' + text + "</a>";
        });

编辑 - 清晰度

好的,我猜上面的内容并不清楚。

如果我有这句话bladi bladh.@praks5432.Bladi blah
我想捕获@praks5432

如果我有这句话bladi bladh.@praks5432
我想捕获@praks5432

如果我有@praks5432..
我想捕获@praks5432

如果我有.@praks5432.
我想捕获@praks5432

6 个答案:

答案 0 :(得分:2)

如果您只想在匹配的字符串中获取捕获的组,请不要使用g标志:

".@blah.".match(/(?:[\s.]|^)@(\w+)/)

给出

[".@blah", "blah"]

因此您只需使用索引1处的元素。

答案 1 :(得分:1)

所以基本上,你只想要一个以.@开头的单词?

那将是/\.@(\w+)/。如果您想捕获@,请使用/\.(@\w+)/

喜欢这样

"if i .@praks5432.".match(/\.(@\w+)/)[1] 注意: [1] =捕获第一组

<强>更新

你想要一个单词前面有一个(.或一行的开头)和一个@吗?

OR需要非捕获组。短语(?:^|\.)表示行(^)或点(\.)的开头。 ?:表示不应捕获该组。

那就是"@praks5432.".match(/(?:^|\.)(@\w+)/)[1]

答案 2 :(得分:0)

不确定,只是在@之前到下一个.之前捕获

 #  /(?:[\s.]|^)(@\w+)\.?\w+/

 (?: [\s.] | ^ )
 (@ \w+ )            # (1)
 \.? 
 \w+ 

答案 3 :(得分:0)

尝试使用它,它将捕获从@到。的所有内容,不包括。

@.*(?=\.)

答案 4 :(得分:0)

简化正则表达式。使用此@(\w+)

我在regexpal.com测试了它

答案 5 :(得分:0)

我的猜测是你要匹配某些文本块中的用户名,而不是电子邮件。如果是这样,也许这是合适的:

/(?:\W|^)(@\w+)/g

现在你在替换调用中的错误是它将替换整个匹配区域,包括用户名之前的char(如果有的话)。负面的后视通常用于此,但它在JS中不可用,而是你可以做到:

text.replace(/(\W|^)(@\w+)/g, function(match, p1, p2) {
        var text = p2,
            link = '/' + text.slice(1);
        return p1 + '<a href="' + link + '" target="_blank">' + text + "</a>";
    })