^(...)*(X|O)\2\2|(X|O)(.{2,3}\3)\4|^..(X|O).\5.\5
####
#!/usr/bin/perl -w
# Test regular expression on Tic Tac Toe boards.
my @X_wins = (
'XXX......' ,
'...XXX...' ,
'......XXX' ,
'X..X..X..' ,
'.X..X..X.' ,
'..X..X..X' ,
'X...X...X' ,
'..X.X.X..' ,
);
my @O_wins = @X_wins;
s/X/O/g for @O_wins;
my @noone_wins = (
'XO-------' ,
'XX-XOO---' ,
'-XX-XX-O-' ,
'OXO--XXO-' ,
'OOXXXO---' ,
'OXXX-XOO-' ,
'OOXXX----' ,
'XOOOXOOO-' ,
'OXOXOX---' ,
);
foreach my $board (@X_wins, @O_wins, @noone_wins){
print "$board " . ( is_win($board) ? "is" : "is not") . " a win.\n";
}
sub is_win {
return shift =~ m/^(...)*(X|O)\2\2|(X|O)(.{2,3}\3)\4|^..(X|O).\5.\5/;
}
####
^(...)*(\w)\2\2|^..(\w).\3.\3|(\w)..\4..\4|(\w)...\5...\5
####
(\w)(..(\1|.\1.)..\1|.\1.\1..$|\1\1(...)*$)