所以我有这个正则表达式
/(?:[\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
答案 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>";
})