问题描述
我有一个由外部API(从minecraft bedrock服务器断开的ping)提供的字符串,看起来像以下格式:
Edition (MCPE or MCEE);MOTD line 1;Protocol Version;Version Name;Player Count;Max Player Count;Server Unique ID;MOTD line 2;Game mode;Game mode (numeric);Port (IPv4);Port (IPv6)
我只需要执行string.split(';')
就可以在分号定界符之间获取每个值,但是问题在于MOTD line 1
和MOTD line 2
的值可以有一个;
在其中,作为价值的一部分。这是上面的格式示例,其值本身中没有分号:
MCPE;Dedicated Server;390;1.14.60;0;10;13253860892328930865;bedrock level;Survival;1;19132;19133;
...这是上面的示例,其中MOTD行1和2的值中包含分号。
MCPE;MOTD A;B;C;390;1.14.60;0;10;13253860892328930865;bedrock level a; b; c;Survival;1;19132;19133;
您可能会猜到,仅通过分隔符分割字符串是行不通的。 MOTD行1/2由服务器所有者提供,几乎可以包含任何字符。只有MOTD值中可以包含分号。
我已经在这个问题上停留了一段时间,在discord上的任何编程服务器中都找不到任何帮助。我尝试使用RegEx解析MOTD行直到下一个;number
,但是我没有足够的经验来做。 Here is the link是我从那里获得此字符串的地方。
解决方法
已编辑:这是根据新近发表的评论更新的答案。
尝试
x.split(';').reduce((prev,current) => {
if (/^\d/.test(current) || prev.length === 0 || !prev[prev.length - 1].startsWith('MOTD')) prev.push(current);
else prev[prev.length - 1] += ';' + current;
return prev;
},[]);