我正在尝试使用一个看起来像下列之一的字符串:
我想取每艘船的坐标并将它们放在2D阵列上。我理解如何使用正则表达式,但我实际上很难将其转换为我可以轻松使用的坐标。有什么建议吗?
答案 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)
匹配其他坐标并将其捕获
\)?
匹配')',但它是可选的
$
字符串
希望在某种程度上有希望。