使用Regex将字符串解释为JavaScript中的坐标

时间:2016-06-21 19:47:27

标签: javascript

我正在尝试使用一个看起来像下列之一的字符串:

  • 放置在A1,A2,A3,A4,A5上的航空母舰; B6,C6,D6的战列舰;和一艘潜艇在H3,I3,J3;
  • A:A1-A5; B:B6-D6; S:H3-J3
  • A(A1-A5); B(B6-D6); S(H3-J3);
  • B(B6-D6); S(H3-J3); A(A1-A5)

我想取每艘船的坐标并将它们放在2D阵列上。我理解如何使用正则表达式,但我实际上很难将其转换为我可以轻松使用的坐标。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我不知道你假装的最终格式是什么。我只是为了好玩而快速解析。你可以尝试从这里改进

function parseCoord(coord){
  return [coord[0].codePointAt() - 65, ~~coord[1]];
}

const yourString = "A:A1-A5;B:B6-D6; S:H3-J3"

const output = yourString
  .split(';')
  .map(x => x.match( /^\s?([BSA])[(:]?([A-Z]\d)-([A-Z]\d)\)?$/ ))
  .filter( x => !!x)
  .map( ([, type, ...coords]) => [type, ...coords.map(parseCoord)] )
  .reduce( (obj, [type, ...coords]) => Object.assign({ [type]: coords}, obj), {});

我得到什么作为输出?

{ 
  S: [ [ 7, 3 ], [ 9, 3 ] ],
  B: [ [ 1, 6 ], [ 3, 6 ] ],
  A: [ [ 0, 1 ], [ 0, 5 ] ] 
}

我可以从这里改进,但我真的不知道你需要什么作为最终结果

如果您希望'A'为1而不是零,则只需在parseCoord函数中将65换成64即可。

您还可以调整正则表达式以使数字大于9,而不是匹配像/\d/这样的单个数字,您可以匹配1位数并使用可选修饰符/\d\d?/创建第二个数字。所以匹配组想要([A-Z]\d\d?)

PS:很抱歉,如果您不熟悉ES6语法,我每天都会使用它,我无法自拔。

编辑:正则表达式可能看起来很吓人。通常你有问题,用正则表达式解决它。现在你有两个问题。

我会尝试解释正则表达式

/^\s?([BSA])[(:]?([A-Z]\d)-([A-Z]\d)\)?$/

^字符串的开头

\s?有一个可选空格

([BSA])匹配字母B,S或A并捕捉它们

[(:]?有一个'('或'':'但它是可选的

([A-Z]\d)匹配A到Z的字母后跟数字并捕捉它们

-匹配' - '。这是必需的,因为没有'?'

([A-Z]\d)匹配其他坐标并将其捕获

\)?匹配')',但它是可选的

$字符串

的结尾

希望在某种程度上有希望。