首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >正则表达式计算扑克牌直牌吗?

正则表达式计算扑克牌直牌吗?
EN

Stack Overflow用户
提问于 2010-08-12 08:54:51
回答 2查看 2.5K关注 0票数 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值,简单地说正则表达式。详细信息here

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-12 09:04:42

我必须承认,正则表达式不是我想到的第一个这样做的工具。我几乎可以保证,任何能够对未排序的手做这件事的RE都将比同等的过程代码更丑陋,可读性更差。

假设卡片是按面值排序的(看起来是按面值排序的,否则列出的正则表达式也不起作用),并且必须使用正则表达式,可以使用如下结构

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

来检测手部的面值部分。

事实上,从我收集的“标准”手中的here来看,应该按优先级递减的顺序检查以下内容:

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,因为它们将以这种方式排序。

票数 5
EN

Stack Overflow用户

发布于 2018-05-31 00:24:09

我为此重写了正则表达式,因为我发现它令人沮丧和困惑。分组对于这种类型的逻辑更有意义。排序是使用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' },
  ];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3463964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档