Minecraft控制台和nodejs的正则expression式

我正在为Minecraft服务器做一个包装,而且我一直被困在这一个正则时代的匹配问题上。 基本上我想匹配以下部分

[04:57:40] [Server thread/INFO]: <§c§lAdmin §7§oUser1§r> msg [04:57:50] [Server thread/INFO]: <§c§lAdmin §7§oUser2§r> msg [04:58:16] [Server thread/INFO]: <§c§lAdmin §7§oUser1§r> msg [04:58:28] [Server thread/INFO]: <§4§lCoOwner §7§oUser2§r> msg [04:58:33] [Server thread/INFO]: <§c§lAdmin §7§oUser1§r> msg ^-------------------^<--That 

现在,对于那些不熟悉Minecraft用户名的人来说,有三个部分:

  • 前缀:由0-16个字符组成,包括“§”。 '§'后面必须跟一个字母或数字。
  • 用户名:字母,数字和下划线,长度在3到16个字符之间。 [\w\d]{3,16}轻松满足这一点。
  • 后缀:与前缀相同

因此,除了上述之外,我需要把这三个部分分开。

有没有办法在JS RegExp中做到这一点? 我能想到的唯一方法是使用lookbehinds。 做一个JS函数来parsing这个会更好吗? 如果是这样,我该怎么去做呢?

编辑1:这是我目前的正则expression式(?:[§&\d\w ]){0,16}?(\w{3,16})(?:[§&\d\w ]){0,16} ,给出以下的input行:

 <§4&btest &r&rKaidenP§r> woo 

模式组#1是rKaidenP 。 它只需要是KaidenP

如果我理解正确的下一个字符和&应该被忽略:

所以我会这样做:

 const getMessageInfo = line => { line = line.replace(/[\&§]./g, '') const info = line.match(/<(\S+)\s*(\S+?)?>\s(.*)/) return { role: info[2] ? info[1] : 'User', username: info[2] || info[1], message: info[3] } } const data = [ '[04:57:40] [Server thread/INFO]: <Admin User1> msg', '[04:57:50] [Server thread/INFO]: <Admin User2> msg', '[04:58:16] [Server thread/INFO]: <Admin User1> msg', '[04:58:28] [Server thread/INFO]: <CoOwner User2> msg', '[04:58:33] [Server thread/INFO]: <Admin User1> msg', '[04:58:33] [Server thread/INFO]: <User1> msg', '<§4&btest &r&rKaidenP§r> woo' ] for (const line of data) { const msg = getMessageInfo(line) console.log(line) console.log(msg) }