首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Scala中将国际象棋棋子与字符串分开?

如何在Scala中将国际象棋棋子与字符串分开?
EN

Stack Overflow用户
提问于 2021-02-06 16:14:47
回答 3查看 67关注 0票数 1

我有字符串格式的棋子信息,例如:"Ka5Qb3a8b7",其中"Ka5"在a5中代表国王,"Qb3"在b3中代表皇后,"a8"在a8中代表士兵。所以如果'‘那么士兵。

我如何将每个部分分开,以便稍后将它们放入各自的对象中?我想我可以遍历每个索引,并将它们与不同的大小写相匹配,并跳过后面的1到2个字符,这取决于士兵或非士兵。但是,如果存在这种方法,我更喜欢更短、更具可读性的代码。

我最初的想法是分组成3个字母的大小,但显然士兵只带2个字母是不可能的。我使用的是Scala。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-06 18:42:55

另一种选择是使匹配更加具体,列出所有可用的大写/小写字符和数字,其中大写字符是使用问号的可选字符类[KQNBR]?

代码语言:javascript
运行
复制
"[KQNBR]?[a-h][1-8]".r.findAllIn("Ka5Qb3a8b7").toArray
res0: Array[String] = Array(Ka5, Qb3, a8, b7)

如果字符串始终采用相同的格式,则也可以使用带lookarounds的split。

代码语言:javascript
运行
复制
"Ka5Qb3a8b7".split("(?<=\\d)(?=[A-Za-z])")
res0: Array[String] = Array(Ka5, Qb3, a8, b7)
票数 2
EN

Stack Overflow用户

发布于 2021-02-06 16:50:34

正则表达式模式可以做到这一点。

代码语言:javascript
运行
复制
"[A-Z]?[a-z]\\d".r.findAllIn("Ka5Qb3a8b7").toList
//res0: List[String] = List(Ka5, Qb3, a8, b7)
票数 4
EN

Stack Overflow用户

发布于 2021-02-07 03:51:30

在Scala2.13中,您可以使用List.unfold

代码语言:javascript
运行
复制
val chess = "Ka5Qb3a8b7"
List.unfold(chess) { remainingMoves =>
  Option.when(remainingMoves.nonEmpty) {
    val (currentMove, remaining) = remainingMoves.span(!_.isDigit)
    (currentMove + remaining.head, remaining.tail)
  }
}

结果是:

代码语言:javascript
运行
复制
List(Ka5, Qb3, a8, b7)

代码运行Scastie

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66074837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档