5

是否有正则表达式来计算直接扑克手?

我正在使用字符串来表示已排序的卡片,例如:

AAAAK#sssss = 4 aces and a king, all of spades.
A2345#ddddd = straight flush, all of diamonds.

在 Java 中,我使用这些正则表达式:

regexPair = Pattern.compile(".*(\\w)\\1.*#.*");
regexTwoPair = Pattern.compile(".*(\\w)\\1.*(\\w)\\2.*#.*");
regexThree = Pattern.compile(".*(\\w)\\1\\1.*#.*");
regexFour = Pattern.compile(".*(\\w)\\1{3}.*#.*");
regexFullHouse = Pattern.compile("((\\w)\\2\\2(\\w)\\3|(\\w)\\4(\\w)\\5\\5)#.*");
regexFlush = Pattern.compile(".*#(\\w)\\1{4}");

如何使用正则表达式计算直接(序列)值?

编辑

我打开另一个问题来解决同样的问题,但使用 char 的 ascii 值来使正则表达式变短。详情在这里

谢谢!

4

2 回答 2

5

我不得不承认,正则表达式并不是我想到的第一个工具。我几乎可以保证,任何能够对未分类的手执行此操作的 RE 都将比等效的程序代码更可怕且可读性更低。

假设卡片按面值排序(否则它们似乎是您列出的正则表达式也不起作用),并且您必须使用正则表达式,您可以使用类似的构造

2345A|23456|34567|...|9TJQK|TJQKA

检测手的面值部分。

事实上,根据我在这里收集到的“标准”牌,应该按照优先级递减的顺序检查以下内容:

Royal/straight flush: "(2345A|23456|34567|...|9TJQK|TJQKA)#(\\w)\\1{4}"
Four of a kind:       ".*(\\w)\\1{3}.*#.*"
Full house:           "((\\w)\\2\\2(\\w)\\3|(\\w)\\4(\\w)\\5\\5)#.*"
Flush:                ".*#(\\w)\\1{4}"
Straight:             "(2345A|23456|34567|...|9TJQK|TJQKA)#.*"
Three of a kind:      ".*(\\w)\\1\\1.*#.*"
Two pair:             ".*(\\w)\\1.*(\\w)\\2.*#.*"
One pair:             ".*(\\w)\\1.*#.*"
High card:            (none)

基本上,除了我添加了皇家/同花顺和顺子之外,这些与您的相同。如果你按顺序检查它们,你应该得到最好的分数。高卡没有正则表达式,因为在这一点上,它是您唯一可以获得的分数。

我还将钢轮(环绕式)直线从A2345更改为 ,2345A因为它们将按这种方式排序。

于 2010-08-12T01:04:41.527 回答
0

我为此重写了正则表达式,因为我发现它令人沮丧和困惑。对于这种类型的逻辑,分组更有意义。排序是使用 javascript 中的标准数组排序方法完成的,因此卡片的顺序很奇怪,它们是按字母顺序排列的。我在javascript中做了我的,但正则表达式可以应用于java。

hands = [
    { regex: /(2345A|23456|34567|45678|56789|6789T|789JT|89JQT|9JKQT|AJKQT)#(.)\2{4}.*/g , name: 'Straight flush' },
    { regex: /(.)\1{3}.*#.*/g , name: 'Four of a kind' },
    { regex: /((.)\2{2}(.)\3{1}#.*|(.)\4{1}(.)\5{2}#.*)/g , name: 'Full house' },
    { regex: /.*#(.)\1{4}.*/g , name: 'Flush' },
    { regex: /(2345A|23456|34567|45678|56789|6789T|789JT|89JQT|9JKQT|AJKQT)#.*/g , name: 'Straight' },
    { regex: /(.)\1{2}.*#.*/g , name: 'Three of a kind' },
    { regex: /(.)\1{1}.*(.)\2{1}.*#.*/g , name: 'Two pair' },
    { regex: /(.)\1{1}.*#.*/g , name: 'One pair' },
  ];
于 2018-05-30T16:24:09.103 回答