2017-03-09 40 views
2

我正在爲Minecraft服務器製作一個包裝器,並且我一直被困在這一個適用於Ages的正則表達式匹配問題上。基本上我想匹配以下段現在正則表達式與Minecraft控制檯和nodejs

[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中做到這一點?我能想到的唯一方法是使用lookbehinds。做一個JS函數來解析它會更好嗎?如果是這樣,我該如何去做呢?

編輯1:這是我目前正則表達式(?:[§&\d\w ]){0,16}?(\w{3,16})(?:[§&\d\w ]){0,16},給定輸入下面的一行:

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

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

+0

只是澄清時你說'rKaidenP'應該是'KaidenP',這是否意味着在用戶名部分應該忽略'§'之後的第一個字符?由於測試輸入中的用戶名似乎是'rKaidenP' – Nico

+0

所以在該符號後忽略一次充電。 –

+0

請注意,截面標誌不應放入日誌中;這是一個錯誤(但不是很快就會得到修復的錯誤)。請參閱[MC-112693](https://bugs.mojang.com/browse/MC-112693),如果您想修復它,請投票表決。還有一個craftbukkit公關,它修復了它(用更奇特的方式,它也修復了幾個關於聊天懸停的功能),這是我寫的,但現在沒有鏈接(如果你有興趣,我會在稍後得到它)。 – Pokechu22

回答

0

如果我沒有理解corectly下一個字符fafter§和&應該被忽略:

,所以我會做到這一點:

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) 
 
}

+0

好吧,我真的不知道爲什麼我沒有想到像這樣分裂它。我不希望忽略下一個字符,但忽略它是沒有損失,所以這個工程。謝謝 –

+0

但我只是意識到,如果沒有前綴,rege就不會匹配。所以比如說

+0

爲什麼要這樣呢? –