<强>是否有一个正则表达式来计算直扑克手吗

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

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}");

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

修改

我打开另一个问题解决同样的问题,但使用炭的ASCII值, 以正则表达式很短。细节 href="https://stackoverflow.com/questions/3482151/regex-to-calculate-straight-poker-hand-using-ascii-code">这里。

谢谢!

有帮助吗?

解决方案

我不得不承认,正则表达式是不是第一个工具,我会做这样认为。我几乎可以保证能够做任何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)

基本上,这些都是一样的你除我已经添加了皇家/直冲洗和直线。提供您检查,以便他们,你应该从手的最好成绩。有没有正则表达式以来的高卡,在这一点上,它是唯一的得分,你可以有。

我也改变钢轮(回绕)从A23452345A直道,因为它们会被排序的方式。

其他提示

我重写了正则表达式,因为我发现它令人沮丧和混淆。分组让这种类型的逻辑更多的意义。排序被在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' },
  ];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top