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@)/