我有以下正则表达式模式,可以找到一个人在邮件中标记的所有玩家:
/(?<=.*)(?<=[@])([a-zA-Z0-9]){1,16}(?=[ ].*)(?=.{2,})/
@ benjamin @ tyler @ joe @ nic 您好!
以下正则表达式可以选择整个标记文本:
/([@]([a-zA-Z0-9]){1,16}[ ]){1,}/
@benjamin @tyler @joe @nic 您好! (包括之前的空间&#34;你好!&#34;以及标记的玩家之间)
但是,我想要一种方法来抓取消息的正文,例如:
@benjamin @tyler @joe @nic 你好!
我会用什么样的模式来实现这个目标?
答案 0 :(得分:2)
也许:
(?:[@](?:[a-zA-Z0-9]){1,16}[ ]){1,}(.*)
如果消息中还包含多行:
(?:[@](?:[a-zA-Z0-9]){1,16}[ ]){1,}((?:.|\s)*)
注意:这些不会从身体中间拉出用户名
如果要提取所有引用的用户名:
/(?:(@\w{1,16})\b){1,}/g
你现在只会拉出最后一个。
修改强>
事实上,使用最后一个正则表达式:
function getUsernamesAndBody(message) {
let regex = /(?:(@\w{1,16})\b){1,}/g,
info = {
body: message,
usernames: []
}
do {
match = regex.exec(message);
if (match) {
info.usernames.push(match[1])
}
} while (match);
info.usernames.forEach((username) => {
info.body = info.body.replace(username, "").trim();
});
return info
}
let fullMessage = `@benjamin @tyler @joe @nic Hello! Hi @john
Hi Guys`;
console.log(getUsernamesAndBody(fullMessage))
&#13;
它会为数组添加多个相同的用户名,但如果您只想捕获一个提及,则可以在其中添加一个检查。这也意味着如果在身体中间提到了用户名,那么你已经捕获了该用户名并将其从正文中移除(如果不需要,那么可以进行一些返工)
答案 1 :(得分:1)
/([@]([a-zA-Z0-9]){1,16}[ ]){1,}(.+)/.exec(`@benjamin @tyler @joe @nic Hello!`)[matchingGroup]
其中匹配组在这种情况下为3,因为它是您的第三组括号。
答案 2 :(得分:1)
我相信这有效。
console.log(/([@]([a-zA-Z0-9]){1,16}[ ]){1,}((.|\s)*)/.exec("@benjamin @tyler @joe @nic Hello\nnewlines work too! oi*)&) hjoi[JPOIJ(N#* Any character works yay! Even the @ symbol!")[3]);
&#13;