我有字符串格式的棋子信息,例如:"Ka5Qb3a8b7"
,其中"Ka5"
在a5中代表国王,"Qb3"
在b3中代表皇后,"a8"
在a8中代表士兵。所以如果'‘那么士兵。
我如何将每个部分分开,以便稍后将它们放入各自的对象中?我想我可以遍历每个索引,并将它们与不同的大小写相匹配,并跳过后面的1到2个字符,这取决于士兵或非士兵。但是,如果存在这种方法,我更喜欢更短、更具可读性的代码。
我最初的想法是分组成3个字母的大小,但显然士兵只带2个字母是不可能的。我使用的是Scala。
发布于 2021-02-06 18:42:55
另一种选择是使匹配更加具体,列出所有可用的大写/小写字符和数字,其中大写字符是使用问号的可选字符类[KQNBR]?
。
"[KQNBR]?[a-h][1-8]".r.findAllIn("Ka5Qb3a8b7").toArray
res0: Array[String] = Array(Ka5, Qb3, a8, b7)
如果字符串始终采用相同的格式,则也可以使用带lookarounds的split。
"Ka5Qb3a8b7".split("(?<=\\d)(?=[A-Za-z])")
res0: Array[String] = Array(Ka5, Qb3, a8, b7)
发布于 2021-02-06 16:50:34
正则表达式模式可以做到这一点。
"[A-Z]?[a-z]\\d".r.findAllIn("Ka5Qb3a8b7").toList
//res0: List[String] = List(Ka5, Qb3, a8, b7)
发布于 2021-02-07 03:51:30
在Scala2.13中,您可以使用List.unfold
val chess = "Ka5Qb3a8b7"
List.unfold(chess) { remainingMoves =>
Option.when(remainingMoves.nonEmpty) {
val (currentMove, remaining) = remainingMoves.span(!_.isDigit)
(currentMove + remaining.head, remaining.tail)
}
}
结果是:
List(Ka5, Qb3, a8, b7)
代码运行Scastie。
https://stackoverflow.com/questions/66074837
复制相似问题