Javascript 用于在聊天室中标记玩家的正则表达式
我有以下正则表达式模式,可以找到一个人在消息中标记的所有玩家:Javascript 用于在聊天室中标记玩家的正则表达式,javascript,regex,Javascript,Regex,我有以下正则表达式模式,可以找到一个人在消息中标记的所有玩家: /(? 这里匹配的组是3,因为它是第三组括号。也许: (?:[@](?:[a-zA-Z0-9]){1,16}[ ]){1,}(.*) 如果消息中还包括多行: (?:[@](?:[a-zA-Z0-9]){1,16}[ ]){1,}((?:.|\s)*) 注意:这些不会从正文中间拉出用户名 如果要提取所有引用的用户名: /(?:(@\w{1,16})\b){1,}/g 现在你的只会拔出最后一个 编辑 事实上,在那里使用最后一个正则
/(?
这里匹配的组是3,因为它是第三组括号。也许:
(?:[@](?:[a-zA-Z0-9]){1,16}[ ]){1,}(.*)
如果消息中还包括多行:
(?:[@](?:[a-zA-Z0-9]){1,16}[ ]){1,}((?:.|\s)*)
注意:这些不会从正文中间拉出用户名
如果要提取所有引用的用户名:
/(?:(@\w{1,16})\b){1,}/g
现在你的只会拔出最后一个
编辑
事实上,在那里使用最后一个正则表达式:
函数getUsernamesAndBody(消息){
设正则表达式=/(?:(@\w{1,16})\b){1,}/g,
信息={
正文:信息,
用户名:[]
}
做{
match=regex.exec(消息);
如果(匹配){
info.usernames.push(匹配[1])
}
}while(匹配);
info.usernames.forEach((用户名)=>{
info.body=info.body.replace(用户名“”).trim();
});
返回信息
}
让fullMessage=`@benjamin@tyler@joe@nic你好!你好@john
大家好`;
log(getUsernamesAndBody(fullMessage))
我相信这是可行的
console.log(/([@]([a-zA-Z0-9]){1,16}[]){1,}(.|\s)*)/exec(@benjamin@tyler@joe@nic Hello\nnewlines也能用!oi*)和hjoi[JPOIJ(N#*任何字符都能用!即使是@symbol!”)[3])
(?:[^\W}{1,16}+)+/code>较短。注意,这与凯尔的答案不匹配(这正是我自己想要做的)生成正确的解决方案,该解决方案匹配换行符和其他字符,包括@符号,同时返回组并打印,而不是将其保留在非捕获括号中。@Feathercrown非常确定
匹配任何字符。为什么您认为它不匹配@?…OP可能还可以找到如何添加如果他们想要换行。据我们所知,他们的消息可能在没有换行的情况下存储……我注意到你一直在使用非捕获括号,这意味着你实际上无法提取任何内容……(我在很多信息上使用非捕获,因为其中的信息没有被请求捕获,所以为什么要存储你不需要的数据?“然而,我想要一个方法来抓取…消息体”它被请求了。消息体被捕获,用户名被删除not@Feathercrown添加了my username Capture的示例用法,实际使用字符串并调用.replace(regex.))
可能是最好的选择…甚至在性能方面也是如此警告:lookbehind还没有被浏览器广泛实现和采用。不要使用它们。(?我想我已经开始更好地理解正则表达式了。因此,整个字符串可以是一个“匹配”,但可以捕获多个“组”“并在请求时返回它们,使lookarounds不是非常必要吗?效果很好。如果我们将较少的组作为捕获(这是我刚刚在这里学到的。例如,/(?:[@](?:[a-zA-Z0-9]){1,16}[]{1,}((?:.|\s)*)/
将只作为一个组捕获消息的主体,这会更干净一些。”。
/(?:(@\w{1,16})\b){1,}/g