[英]Regex for matching a pokerhand (Java)
正則表達式新秀在這里。
我需要一個與特定撲克手相匹配的正則表達式(滿屋子-一張撲克手包含一張三張牌和另一張兩張牌)。它應將其識別為滿屋,其中任意順序的撲克牌以及所有撲克等級(23456789TJQKA)和西服(SHDC)
我什至不確定正則表達式是否是正確的工具,所以請告訴我您是否認為我應該做其他事情:)
一個示例字符串可能看起來像
“ KD KC AH AC AD”
(鑽石之王,俱樂部之王,紅桃王,俱樂部之王,鑽石之王)
我想出了這個難看的正則表達式
(?=.*(([2-9TJQKA])[SHDC]).*\2[SHDC].*\2[SHDC])(?=.*(?!\2)(([2-9TJQKA])[SHDC]).*\4[SHDC].*\4[SHDC]).*
但這似乎無法完成任務。
這應該與“滿屋”相匹配:(編輯:並且實際上只是您原來的正則表達式被固定以忽略該西裝)
(?=.*([2-9TJQKA])[SHDC].*\1[SHDC].*\1[SHDC])(?=.*((?!\1)[2-9TJQKA])[SHDC].*\2[SHDC])
它以第一個先行查找“ 3”序列。 正在尋找“ 2”序列的第二前瞻,其中包含負前瞻,以防止重復匹配。 正則表達式完全由兩個先行組成,可以防止如果我們實際匹配(並將指針移至任何位置)任何字符會出現的問題-這兩個子模式均可在字符串中的任意位置進行匹配。
可以使用番石榴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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.