^(...)*(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(...)*$)