柿木形式の棋譜解析用の正規表現について

将棋ポータルでは棋譜読み込みの処理に正規表現を使用しています。
対象としている棋譜は柿木形式で記載されているものです。

・よくある柿木形式
   1 7六歩(77)   ( 0:00/00:00:00)
柿木形式は現在、最も普及している棋譜の形式じゃないでしょうか?
棋譜でーたべーすの棋譜も、各タイトル戦の棋譜中継でも用いられています。
将棋倶楽部24も柿木形式です。

まず、手数、指し手、動かす駒、消費時間の順に記載されています。

これを正規表現で表してみたのが以下のものです。
・作成してみた正規表現
^(\n|\r|\s)*(?<move>\d?\d?\d?)\s*(((?<toX>[123456789])(?<toY>[一二三四五六七八九])|(?<equal>同)\s))(?<piece>成?[歩香桂銀金角飛王玉と馬竜])(?<opt>[成打]?)(\((?<fromX>\d)?(?<fromY>\d)\)|)\s*(\(\s*\d:\d\d/(?<time>\d\d:\d\d:\d\d)\)|)

それぞれ分解してみていきます。
1.手数
正規表現
(?<move>\d?\d?\d?)
柿木形式では、手数を1桁、2桁、3桁で表現されます。なので、0~9を表す\dを3つそれぞれあるかないか?をつけています。

ちなみに公式で最長手数は芹沢博文VS原田泰夫の390手らしいので3桁で問題ないはずです。

2.指手
正規表現
(((?<toX>[123456789])(?<toY>[一二三四五六七八九])|(?<equal>同)\s))(?<piece>成?[歩香桂銀金角飛王玉と馬竜])(?<opt>[成打]?)
指手は全角の数字、漢数字、駒、成る、打つのオプションで構成されています。
また、駒には成香、成桂、成銀等の駒の前に成がつく文字があります。

3.動かす駒
正規表現
(\((?<fromX>\d)?(?<fromY>\d)\)|)
動かす駒は()で挟まれた2桁の数値で表します。
正規表現では()の記号自体はグループの意味を持つため、\(\)と記述しなければいけません。

4.消費時間
正規表現
(\(\s*\d:\d\d/(?<time>\d\d:\d\d:\d\d)\)|)
消費時間はあったりなかったりが激しいですが一様読み取れるようにしています。


以上、柿木形式を読み取るために作成した正規表現でした。
きっともっといい記述があるかもしれませんが、参考までに載せておきます。

0 comments:

Post a Comment