簡體   English   中英

用於匹配撲克手的正則表達式(Java)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM