我正在为我的世界服务器制作一个包装器,我已经被这个正则表达式匹配问题困扰了很长时间。基本上我想匹配以下片段
[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}
轻松满足此要求。 - 后缀:与前缀相同
因此,在上述内容中,我需要将这 3 个部分分开。
有没有办法在 JS RegExp 中做到这一点?我能想到的唯一方法是使用后视。做一个JS函数来解析这个会更好吗?如果是这样,我该怎么做?
编辑1:这是我当前的正则表达式(?:[§&\d\w ]){0,16}?(\w{3,16})(? :[§&\d\w ]){0,16}
,给定以下输入行:
<§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)
}
关于javascript - 使用 Minecraft 控制台和 Nodejs 进行正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42687613/