正则表达新秀在这里。
我需要一个与特定扑克牌相匹配的正则表达式(满屋 - 包含一张等级的三张牌和另一张等级的两张牌的扑克牌)它应该将其识别为任意顺序的卡片满屋并且所有卡级别(23456789TJQKA)和套装(SHDC)
我甚至不确定正则表达式是否是正确的工具,所以如果您认为我应该做其他事情,请告诉我:)
示例字符串可能看起来像
" KD KC AH AC AD"
(金刚之王,俱乐部之王,心之王,俱乐部之王,王牌之王) 菱形)
我想出了这个丑陋的正则表达式
(?=.*(([2-9TJQKA])[SHDC]).*\2[SHDC].*\2[SHDC])(?=.*(?!\2)(([2-9TJQKA])[SHDC]).*\4[SHDC].*\4[SHDC]).*
但它似乎没有完成这项工作。
答案 0 :(得分:2)
这应该匹配“满屋”#(编辑:并且实际上只是你原来的正则表达式修复忽略了诉讼)
(?=.*([2-9TJQKA])[SHDC].*\1[SHDC].*\1[SHDC])(?=.*((?!\1)[2-9TJQKA])[SHDC].*\2[SHDC])
它寻找" 3"第一个前瞻的序列。第二个前瞻,正在寻找" 2"序列,包括一个负向前瞻,以防止重复匹配。正则表达式完全由两个前瞻组成,它们可以防止在我们实际匹配(并将指针向前移动)任何字符时出现的问题 - 这两个子模式都可以自由匹配字符串中的任何位置。
答案 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;
}
}