| メッセージの中からSGF棋譜データを抽出するためにkoumeiさんやjunichiroさんのアドバイスを受けながら下記のようなスクリプトを記載した。 function CH1() { str = document.forms[0].SGF.value; str = str.replace(/\n/g, ""); //改行コードを削除 str = str.replace(/\s/g, ""); //空白文字を削除 str = str.replace(/ID\[[0-9]*\]/g, ""); //IDプロパティを削除 str = str.replace(/AP\[.*?\]/g, "") //APプロパティを削除 str = str.match("\(\;GM.*.\]\)"); //SGFデータを抽出 if(str) str = str[0]; else str = "(;GM[1]FF[1]SZ[19]NE[W]KM[6.5]RU[JP])"; location.replace('mailgo1.html?SGF=(' + str + ')'); } これで一件落着かと思ったが変化手順があるSGF棋譜データは本手順しか抽出しないことに気がついた。 たとえば(;GM[1]FF[1]SZ[19]NE[B]SS[@0]AP[StoneLeaf2];B[pd];W[nc];B[lc](;W[qc];B[pc];W[qd];B[pe];W[pb];B[ob];W[qb];B[oc];W[qf])(;W[pf];B[nd];W[md];B[mc];W[qd];B[oc];W[qc])(;W[ne];B[pf];W[kd](;B[kc];W[jd];B[ld];W[le];B[jc];W[id];B[hc];W[ge])(;B[oc];W[kc];B[nb]))) というデータの場合には (;GM から最初の ) の W[gf]) までしか抽出しない。 正規表現は最長一致だから最後の B[nb]))) まで含まれるはずなのになぜ最初の W[gf]) で終わってしまうんだろう。 ) の場合は例外なのだろうか。 ) の場合でも最長一致させるにはどうしたらいいのだろう?
|