2010-02-08 18 views
1

條件我想創建一個正則表達式,其中一個組的發生,依賴於其他特定組是否已經找到。我認爲這是比較容易用一個例子來說明的!Java正則表達式;對羣體

我想允許兩個圖案,由這兩個實施例說明:JsJhJJ。 這是不允許的:JsJsJsJJQ

所以,如果用戶鍵入一個小寫字母的第一個大寫一個之後,正則表達式預計第二次增資後,另一個小信 - 但它不應該是相同的字母第一個!

我匹配這樣的第一個(Js):([123456789TJQKA]){1}([dsch]?){1} 第二個大寫字母匹配(\\2)。現在

,我似乎無法找到最後一個小寫字母的解決方案。我可以得到小寫字母匹配(這不是我想要的),但是如果它存在,我如何排除來自最後一組的第一個字母,仍然允許(並期望)剩下的三個字母之一信嗎?

+0

是否重複檢測有在正則表達式中完成?爲什麼不先解析卡對象然後檢查它們是否相等? – finnw 2010-02-08 22:50:58

+0

我在想同樣的事情......但我認爲使用正則表達式來處理整個事情是「更清潔」的。否則,我只是開始有「其他 - 如果」遍佈整個地方:) – 2010-02-08 22:59:15

+0

這些卡片是否總是按預定順序列出?或者同一隻手可以用'Ac5JsJh'或'JhAcJs5'或其他什麼來表示?另外,我注意到你將'1'和'A'匹配爲卡片值;那些都不是指Ace? – 2010-02-09 01:07:08

回答

1

你爲什麼要使用正則表達式來實現紙牌遊戲的邏輯是什麼?看起來很瘋狂......但它可以完成!

s.matches("([123456789TJQKA])([dchs])\\1(?!\\2)[dchs]|([123456789TJQKA])\\3") 

這是一個測試,以驗證它是否工作正常(它也記錄了有關您還沒有涵蓋在你的問題的特殊情況下,我的假設):

public class Test 
{ 
    private static void test(String input, boolean expected) 
    { 
     boolean result = input.matches("([123456789TJQKA])([dchs])\\1(?!\\2)[dchs]|([123456789TJQKA])\\3"); 
     if (result != expected) 
      throw new RuntimeException("Failed!"); 
    } 

    public static void main(String[] args) throws Exception 
    { 
     test("JJ", true); 
     test("JsJd", true); 
     test("11", true); 
     test("2c2h", true); 

     test("Js", false); 
     test("JsJs", false); 
     test("JsJ", false); 
     test("JQ", false); 
     test("1d1d", false); 
     test("J", false); 
     test("", false); 
     test("3d3d", false); 
     test("JsJdJ", false); 
     test("JsJdJh", false); 
     test("1A", false); 
    } 
} 
+0

正則表達式僅用於解析手勢。所以用戶可以輸入例如。 {A2s +,JJ +,88,AKo,TsTh}作爲他的對手可能擁有的手的分佈。 您的建議可以創造奇蹟!現在我只需要找出實際發生的事情。 – 2010-02-08 22:57:47

+0

@弗雷德裏克,只是幾個小點:我設法錯過了T - 哎呀!現在添加了。也作爲匿名。指出你可以將123456789縮短爲1-9。 – 2010-02-08 23:00:45

+0

非常感謝!我仍然想知道****正在發生什麼。這一行:(?!\\ 2)[dchs] |([123456789TJQKA])\\ 3,它說什麼?我無法在任何地方找到有關'?!' - 語法的任何信息。 也許你有一個很好的java正則表達式的參考?我找不到很多好的資源。 Sun自己似乎...不太全面? – 2010-02-08 23:08:49