簡體   English   中英

Java正則表達式; 團體條件

[英]Java regex; conditions on groups

我想創建一個正則表達式,其中一個組的出現取決於是否找到了另一個特定組。 我認為通過示例更容易說明!

我想允許兩種模式,用這兩個示例來說明: JsJhJJ 這是不允許的: JsJsJsJJQ

因此,如果用戶在第一個大寫字母后鍵入一個小寫字母,則正則表達式會在第二個大寫字母后輸入另一個小寫字母-但它不應與第一個大寫字母相同!

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

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

為什么要使用正則表達式實現紙牌游戲的邏輯? 似乎很瘋狂……盡管如此,還是可以做到的!

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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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