用于匹配pokerhand的正则表达式(Java)

时间:2017-01-11 18:08:50

标签: java regex

正则表达新秀在这里。

我需要一个与特定扑克牌相匹配的正则表达式(满屋 - 包含一张等级的三张牌和另一张等级的两张牌的扑克牌)它应该将其识别为任意顺序的卡片满屋并且所有卡级别(23456789TJQKA)和套装(SHDC)

我甚至不确定正则表达式是否是正确的工具,所以如果您认为我应该做其他事情,请告诉我:)

示例字符串可能看起来像

  

" KD KC AH AC AD"

     (金刚之王,俱乐部之王,心之王,俱乐部之王,王牌之王)   菱形)

我想出了这个丑陋的正则表达式

(?=.*(([2-9TJQKA])[SHDC]).*\2[SHDC].*\2[SHDC])(?=.*(?!\2)(([2-9TJQKA])[SHDC]).*\4[SHDC].*\4[SHDC]).*

但它似乎没有完成这项工作。

2 个答案:

答案 0 :(得分:2)

这应该匹配“满屋”#(编辑:并且实际上只是你原来的正则表达式修复忽略了诉讼)

(?=.*([2-9TJQKA])[SHDC].*\1[SHDC].*\1[SHDC])(?=.*((?!\1)[2-9TJQKA])[SHDC].*\2[SHDC])

它寻找" 3"第一个前瞻的序列。第二个前瞻,正在寻找" 2"序列,包括一个负向前瞻,以防止重复匹配。正则表达式完全由两个前瞻组成,它们可以防止在我们实际匹配(并将指针向前移动)任何字符时出现的问题 - 这两个子模式都可以自由匹配字符串中的任何位置。

online demo here

答案 1 :(得分:1)

您可以使用番石榴Multimap代替正则表达式,并检查您是否只有两个不同的等级,然后检查其中一个等级是否有3个套装。

public class Foo {
    public static void main(String[] a) {
        String s = "KD KC AH AC AD";
        Splitter splitter = Splitter.on(' ');
        System.out.println(checkFullHouse(splitter.split(s)));
    }

    private static boolean checkFullHouse(Iterable<String> in) {
        Multimap<String, Object> m = ArrayListMultimap.create();
        Splitter splitter = Splitter.fixedLength(1);
        in.forEach(s -> {
            List<String> l = Lists.newArrayList(splitter.split(s));
            m.put(l.get(0), l.get(1));
        });
        return m.keySet().size() == 2 && (int) m.keySet().stream().filter(v -> m.get(v).size() == 3).count() == 1;
    }
}