Java正则表达式;团体条件

时间:2010-02-08 22:35:15

标签: java regex

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

我想允许两种模式,如以下两个示例所示:JsJhJJ。 不允许这样做:JsJsJsJJQ

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

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

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

1 个答案:

答案 0 :(得分: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);
    }
}