首页 文章

Java正则表达式;团体条件

提问于
浏览
1

我想创建一个正则表达式,其中一个组的出现取决于是否找到另一个特定组 . 我认为这更容易用一个例子来说明!

我想允许两个模式,由这两个例子说明: JsJhJJ . 这是不允许的: JsJsJsJJQ .

因此,如果用户在第一个大写字母之后输入一个小写字母,正则表达式会在第二个大写字母之后输入另一个小写字母 - 但它不应该与第一个大写字母相同!

我匹配第一个(Js)像这样: ([123456789TJQKA]){1}([dsch]?){1} 第二个大写字母匹配 (\\2) .

现在,我似乎无法找到最后一封小写字母的解决方案 . 我可以得到小写字母(这不是我想要的),但如果它存在,我如何排除最后一组中的第一个字母,仍允许(并期待)剩下的三个中的一个小信吗?

1 回答

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

相关问题