Используйте регулярные выражения для анализа шахматной алгебраической записи - PullRequest
0 голосов
/ 19 декабря 2018

tl; др

Я ищу регулярное выражение, которое соответствует только следующим строкам:

  • Пустая строка
  • +
  • (=)
  • + (=)
  • #

Мотивация:

В шахматах ход может (среди прочего) быть чеком или помощником чека.Пока это не чек-партнёр, игрок может сделать ничью своему противнику после выполнения хода.

Я делаю игрушечный проект, который анализирует шахматные игры, написанные в соответствии с правилами ФИДЕ;они указывают, что следующие суффиксы используются для обозначения предыдущих возможностей:

  • Чек обозначается +;
  • Чек сопряжения указывается #;
  • Предложение на ничью представлено (=).

Таким образом, единственный действительный суффикс:

  • (ничего:ход не является чеком, и игрок не предлагает ничью).
  • (=) (без чека; предлагается ничья)
  • + (чек; ничья не предлагается)..
  • + (=) (чек; предлагается ничья).
  • # (чек, ничья не может быть предложена, так как игра окончена).

Я изо всех сил пытаюсь превратить это в регулярное выражение.Я хочу выразить:

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

Я сделал несколько попыток, но все они терпят неудачу.В духе демонстрации своей работы я добавляю эту, но это, вероятно, мусор: ((\+{0,1}|(\+ (=)){0,1})|#){0,1}

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Это возможно:

((\+{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
)
0 голосов
/ 19 декабря 2018

Только checkmate является особым случаем, два других (check, draw) могут быть объединены с каждым необязательным:

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

0 голосов
/ 19 декабря 2018

Это ваши варианты с точки зрения соответствия групп как flags .

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

Объяснено

   ( [ ] )               # (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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...