首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用regex解析国际象棋代数表示法

使用regex解析国际象棋代数表示法
EN

Stack Overflow用户
提问于 2018-12-19 07:34:55
回答 3查看 218关注 0票数 2

tl;dr

我正在寻找一个只与以下字符串匹配的正则表达式:

  • An empty string
  • +
  • (=)
  • + (=)
  • #

动机:

在国际象棋中,一步棋可以是一盘棋,也可以是一盘棋。只要不是死对头,玩家可以在下一步棋后向对手提供平局。

我正在制作一个玩具项目,它解析按照FIDE规则编写的国际象棋游戏;它们指定使用以下后缀来指示前面的可能性:

check mate表示为+;

  • A check mate;(=).

表示为

  • A

因此,以下是唯一有效的后缀:

抽签(nothing:移动不是支票,玩家不提供抽签(no check;a draw).

  • (=) is offered)

  • + (check;no draw offered)..

  • + (=) (check;A draw is offered).

  • # )
  • ( check;A draw is offered).
  • #(check mate;由于游戏结束后不能提供抽签)。

我正在努力将其转换为正则表达式。我想表达的是:

("+" (0 or 1 times) followed by "(=)" (0 or 1 times)) or ("#" (0 or 1 times))

我做了几次尝试,但都失败了。为了展示我的作品,我添加了这个,但它可能是垃圾:((\+{0,1}|(\+ (=)){0,1})|#){0,1}

EN

回答 3

Stack Overflow用户

发布于 2018-12-19 07:55:06

这些是作为标志的组匹配方面的选项。

([ ])|(\(=\))|(\+)(?!\(=\))|(\+\(=\))|(\#)

解释

代码语言:javascript
复制
   ( [ ] )               # (1), (nothing: the move is not a check, and the player is not offering a draw).
|  
   ( \(=\) )             # (2), (no check; a draw is offered)
|  
   ( \+ )                # (3), (check; no draw offered)
   (?! \(=\) )
|  
   (                     # (4 start), (check; a draw is offered).
        \+
        \(=\)
   )                     # (4 end)
|  
   ( \# )                # (5), (check mate; no draw can be offered since the game is over).
票数 0
EN

Stack Overflow用户

发布于 2018-12-19 08:15:03

这是一种可能性:

((\+{0,1}( \(=\)){0,1})|#{0,1})

解释:

代码语言:javascript
复制
(
 (\+{0,1}           # A plus sign at most 1 time...
 ( \(=\)){0,1})     # Followed by "(=)" at most 1 time
|                   # ... or ...
 #{0,1}             # A hash sign at most 1 time
)
票数 0
EN

Stack Overflow用户

发布于 2018-12-19 08:23:14

只有check case是一个特例,其他两个(check,draw)可以组合在一起,每一个都是可选的:

^(#|\+?(\(=\))?)$

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

https://stackoverflow.com/questions/53842631

复制
相关文章

相似问题

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