用于在聊天中标记玩家的正则表达式

时间:2018-02-06 16:23:59

标签: javascript regex

我有以下正则表达式模式,可以找到一个人在邮件中标记的所有玩家:

/(?<=.*)(?<=[@])([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 你好!

我会用什么样的模式来实现这个目标?

3 个答案:

答案 0 :(得分:2)

也许:

(?:[@](?:[a-zA-Z0-9]){1,16}[ ]){1,}(.*)

如果消息中还包含多行:

(?:[@](?:[a-zA-Z0-9]){1,16}[ ]){1,}((?:.|\s)*)

注意:这些不会从身体中间拉出用户名

如果要提取所有引用的用户名:

/(?:(@\w{1,16})\b){1,}/g

你现在只会拉出最后一个。

修改

事实上,使用最后一个正则表达式:

&#13;
&#13;
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;
&#13;
&#13;

它会为数组添加多个相同的用户名,但如果您只想捕获一个提及,则可以在其中添加一个检查。这也意味着如果在身体中间提到了用户名,那么你已经捕获了该用户名并将其从正文中移除(如果不需要,那么可以进行一些返工)

答案 1 :(得分:1)

/([@]([a-zA-Z0-9]){1,16}[ ]){1,}(.+)/.exec(`@benjamin @tyler @joe @nic Hello!`)[matchingGroup]

其中匹配组在这种情况下为3,因为它是您的第三组括号。

答案 2 :(得分:1)

我相信这有效。

&#13;
&#13;
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;
&#13;
&#13;