使用regex创建tictactoe函数,该函数接收九个“x”、“o”和/或“-”字符组成的字符串,表示tic-tac趾板的状态,例如字符串: "X-OXXXO-O"
这表示:
X-O
XXX
O-O
更多示例:
"XOOOXXXXO" - False - no one got three in a row here.
"OXO-XOX-O" - True - player O won by getting three in a row vertically in the third column.
下面是我编写代码的尝试:
public static boolean regexTicTacToeWinChecker(String b) {
return b.matches("(((^(...)*000(...)*$)|(.*0..0..0.*)|(0(...0{2}))|(.(.0){3}..))) | (((^(...)*XXX(...)*$)|(.*X..X..X.*)|(X(...X){2})|(.(.X){3}..)))");
}
使用regex比编写大量if更有用,if涵盖了所有的情况。所以请回答雷杰克斯,帮助将不胜感激。谢谢这里有一些测试,你可以用来检查:
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
public class ExampleTestCases {
@Test
public void SomeBoardsWithWinnersTests () {
String[] winners = new String[]{"XXX-O-O-O", "X--OOOX-X", "O--OO-XXX", "O-XOX-O-X", "OXOOXOXX-", "X-O-OOXXO", "XO--X-OOX", "X-OXOOOXX"};
for (String winner : winners) {
System.out.println("Testing with board " + winner);
assertEquals(true, RegexTicTacToeWinChecker.regexTicTacToeWinChecker(winner));
}
}
@Test
public void SomeBoardsWithoutWinnersTests () {
String[] notWinners = new String[]{"XO-------", "XX-XOO---", "-XX-OO-O-", "OXO--XXO-", "OOXXXO---", "OXXX-XOO-", "OOXXX----", "XXOOXXOO-", "OXOXOX---"};
for (String notWinner : notWinners) {
System.out.println("Testing with board " + notWinner);
assertEquals(false, RegexTicTacToeWinChecker.regexTicTacToeWinChecker(notWinner));
}
}
}
4条答案
按热度按时间daolsyd01#
你可以试试这个:
查看regex演示
我只是将输入作为模式输入:
输出:
syqv5f0l2#
我更喜欢让你的正则表达式尽可能简单!这意味着您需要停止将所有内容压缩到一根线。
想象一下:
为什么不从中创建几个字符串,比如:
水平线:
XOX
水平线:OOX
水平线:XXO
和垂直线:
XOX
垂直线:OOX
垂直线:XXO
和左上对角线:
XOO
左下对角线:XOX
并针对以下各项运行这些值:在代码中:
js81xvg63#
您可以将其分解为以下几种情况:
水平匹配:
垂直匹配:
对角线匹配(两个方向):
现在,你只要
or
将它们放在一起,并确保regex与board字符串的开头匹配:编辑:下面是一个测试regex的小java程序:
cvxl0en24#
如果你想在几个月内维护你的正则表达式,我宁愿选择可读性更好的,而不是过于聪明的。;
一起:
这使得获胜的模式几乎可以通过查看regex看到。
用同样的方法
O
,你应该可以走了:)