Validation d'une chaîne FEN par les expressions régulières
Bonjour !
J'ai besoin de me fabriquer une fonction qui vérifie la validité d'une chaîne FEN. J'ai essayé de voir si je pourrais le faire avec des expressions régulières (l'unité RegularExpressions de Delphi XE2). J'aimerais bien avoir votre expertise sur ce que j'ai déjà fait.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
{ Delphi XE2
Essai d'un validateur de chaîne FEN
http://kirill-kryukov.com/chess/doc/fen.html
}
program Validateur;
{$APPTYPE CONSOLE}
uses
StrUtils, Types, RegularExpressions;
const
s: array[1..4]of string = (
'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1',
'rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2',
'rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2',
'4k3/8/8/8/8/8/4P3/4K3 w - - 5 39'
);
var
a: TStringDynArray;
e: TRegEx;
p: string;
begin
a := SplitString(s[4], ' ');
Assert(Length(a) = 6);
p := DupeString('[1-8BKNPQRbknpqr]+/', 7) + '[1-8BKNPQRbknpqr]+';
e.Create(p);
Assert(e.IsMatch(a[0]));
e.Create('K');
Assert(e.IsMatch(a[0]));
e.Create('k');
Assert(e.IsMatch(a[0]));
e.Create('w|b');
Assert(e.IsMatch(a[1]));
e.Create('[KQkq]+|\-');
Assert(e.IsMatch(a[2]));
e.Create('[a-h][36]|\-');
Assert(e.IsMatch(a[3]));
//e.Create('[0-9]+');
e.Create('\d+');
Assert(e.IsMatch(a[4]));
Assert(e.IsMatch(a[5]));
Write('Appuyez sur la touche Entrée... ');
ReadLn;
end. |
Et pour commencer j'ai une question. Comment est-ce que je peux obtenir la chaîne correspondant au motif ? Par exemple, le code suivant me permet de savoir qu'il y a un "w" ou un "b" dans la chaîne :
Code:
1 2
| e.Create('w|b');
Assert(e.IsMatch(a[1])); |
Mais ça n'est pas suffisant : il faudrait vérifier que la chaîne n'est constituée de rien d'autre que d'un "w" ou d'un "b". Donc j'aurais voulu faire une vérification du genre Assert(e.ChaineCorrespondante(a[1]) = a[1]) mais je n'ai pas trouvé cette fonction.
Merci d'avance !