JavaScript regexp仅选择最后一次出现 仅选择最后一次出现

JavaScript regexp仅选择最后一次出现 仅选择最后一次出现,javascript,regex,regex-negation,regex-lookarounds,Javascript,Regex,Regex Negation,Regex Lookarounds,我试图选择最后一个单词(直到空格),它们位于最后一个空格和@字符之后 下面是我的字符串 hello hi @why helo @blow but @name // capture: name hello hi @why helo @blow but name@name // capture: blow 还有一根绳子 @blow but not know how to resolve this // capture: blow 这里最后出

我试图选择最后一个单词(直到空格),它们位于最后一个
空格和
@
字符之后

下面是我的字符串

hello hi @why helo @blow but @name             // capture: name
hello hi @why helo @blow but name@name         // capture: blow
还有一根绳子

@blow but not know how to resolve this         // capture: blow
这里最后出现的是第一个单词
blow
,只选择单词后面的
@
(很明显,第一个单词中没有空格)


我尝试过这样做:

您可以简单地使用负前瞻:

@[^@]\w*(?!.*@[^@]\w*)

(?:)
意味着其中的正则表达式不能在该点之后出现。所以这个正则表达式声明在匹配的项之后,你不能在它旁边找到另一个@-东西。这意味着这显然是最后一件事了

请注意,对于这种情况:

@blow but not know how to resolve this@
^                                     ^
|                                     |
will match this one                   |
        because this is not a valid @/
选择了
@blow
,因为
@
-根据您的正则表达式至少需要一个字符。如果要匹配
@
部件,需要将其修改为:

@[^@]?\w*(?!.*@[^@]?\w*)
或者更有效

@[^@]?\w*(?!.*@)
如果
@
必须以字符串开头或空格开头,则可以使用单词边界
\B

\B@[^@]?\w*(?!.*\B@[^@]?\w*)

应该工作;你的话将是第一次捕获。在支持lookbehinds的语言中,您可以

/(?<=^|\s)@[^@]\w*(?!.*\s@)/
这样做的目的是通过积极的前瞻性检查,确保在我们的比赛之后不再有任何
@word

(?:^| )@([^@\s]+)(?!.*?\s@\w+.*$)
你可以试试这个。看演示

最简单的答案:

/\B@[^@]\w*(?!.*?\s@)/

请参见

作为替代方案,类似的内容如何

var字符串=[
“你好,嗨,为什么是helo,吹,但是叫”名字“,
“你好,嗨,为什么是helo”吹,但是name@name',
“你好,嗨,为什么是helo”吹,但是name@name  ',
“@blow但不知道如何解决此问题”,
“@blow但不知道如何解决此问题”,
“塔达”,
'    ',
''
];
var=strings.map(函数(元素){
var found='未找到';
element.split(/\s+/).reverse().some(函数(部分){
如果(部分字符(0)='@'){
找到=零件切片(1);
返回true;
}
});
发现退货;
});
document.getElementById('out').textContent=wanted.join('\n')

是否使用捕获组选择一个选项?否,当光标,点击段落左侧所有字符串将被选中的段落,并找到最后一个空格和@after string。第二行我需要捕获
blow
而不是
名称
@karthikmanchala:你不应该在lookahead中使用单词边界吗?@CommuSoft在lookahead中不需要<代码>\s
在这里更精确。。你能想到为什么吗pye,因为它不再是字符串的开头。但是
\B
并不等同于
(^ |\s |$)
,例如它也匹配
$
。@s͢kyD͢ream很高兴知道它有帮助。)<代码>空白和
@
不捕获。我只需要在上次出现的
空格和
@
后面的单词。第二行我需要捕获
blow
而不是
名称。抱歉,但效果不好,没有选择我需要的所有三行,谢谢你的帮助。@S͢kyD͢ream:忘记了
gmi
标志,应该可以了。是的,对,但我想在键入word后,通过下拉菜单显示基于@的用户名。这种方法也没有问题。
(?:^| )@([^@\s]+)(?!.*?\s@\w+.*$)
/\B@[^@]\w*(?!.*?\s@)/