使用正则表达式解析国际象棋代数符号

时间:2018-12-18 23:34:55

标签: regex

tl; dr

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

  • 一个空字符串
  • +
  • (=)
  • + (=)
  • #

动机:

在国际象棋中,一个动作可以(除其他外)成为支票或同伴。只要不是对位伴侣,玩家就可以在举手之后向对手平局。

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

  • +表示支票;
  • #表示一个配对。
  • 抽奖要约由(=)表示。

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

  • (什么都没有:此举不是支票,玩家没有提供平局)。
  • (=)(不签;提供抽奖)
  • +(选中;不提供抽奖)。
  • + (=)(选中;提供抽奖)。
  • #(检查队友;由于游戏结束,无法抽签)。

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

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

我做了几次尝试,但都失败了。本着展示我的工作的精神,我添加了这一部分,但这可能是垃圾: ((\+{0,1}|(\+ (=)){0,1})|#){0,1}

3 个答案:

答案 0 :(得分:0)

这些是根据标志进行组匹配的选项。

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

解释

   ( [ ] )               # (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).

答案 1 :(得分:0)

这是可能的:

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

解释:

(
 (\+{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
)

答案 2 :(得分:0)

仅将死是一个特殊情况,其他两个(检查,绘制)可以组合使用,每个都是可选的:

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