【问题标题】:Parse semicolon delimited string where the values can have a semicolon解析分号分隔的字符串,其中值可以有分号
【发布时间】:2020-09-05 19:51:55
【问题描述】:

我有一个由外部 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 我是从哪里得到这个字符串的。

【问题讨论】:

  • 那么是什么已知的?当有问题分号时,它总是以 MOTD 开头吗?如果是这样,后面的值是否有特定的格式?
  • 如果你没有办法区分它们,你就无法解析它们。通常你应该有一个转义序列。
  • @slappy 是的,MOTD 行 1/2 有时会出现问题。这些值由用户提供,可以包含协议页面中string 数据类型中讨论的任何字符:wiki.vg/Raknet_Protocol#Data_types
  • @Bergi 是的,我就是这么想的。服务器不会以任何方式逃避它。我只需要找到别人的例子,看看他们是怎么做的。

标签: javascript string delimiter


【解决方案1】:

已编辑:这是根据最近的新评论更新的答案。

试试

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;
}, []);

【讨论】:

  • MOTD line 1 的值可以允许任何字符,空格不必跟在分号后面。我将更新示例以涵盖这一点。
  • 我认为您没有理解,整个 MOTD 值实际上可以是任何值。我只是提供了一个示例,恰好包含与描述相同的词。
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多