解析以分号分隔的字符串,其中值可以具有分号

问题描述

我有一个由外部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 1MOTD 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;
},[]);