Java регулярное выражение; условия на группы - PullRequest
1 голос
/ 09 февраля 2010

Я хочу создать регулярное выражение, где появление одной группы зависит от того, была ли найдена другая определенная группа. Я думаю, что это проще проиллюстрировать на примере!

Я хочу разрешить два шаблона, проиллюстрированные этими двумя примерами: JsJh, JJ. Это не разрешено: JsJs, JsJ, JQ.

Таким образом, если пользователь вводит одну маленькую букву после первой заглавной буквы, регулярное выражение ожидает другую маленькую букву после второй заглавной буквы, но это не должно быть той же буквой, что и первая!

Я соответствую первому (Js), как это: ([123456789TJQKA]){1}([dsch]?){1} Вторая заглавная буква соответствует (\\2).

Теперь я не могу найти решение для последней маленькой буквы. Я могу заставить маленькие буквы соответствовать (что, конечно, не то, что я хочу), но как мне, если она присутствует, исключить первую букву из последней группы, все еще позволяя (и ожидая) одну из трех оставшихся маленьких буквы?

1 Ответ

1 голос
/ 09 февраля 2010

Почему вы используете регулярные выражения для реализации логики карточной игры?Кажется довольно сумасшедшим ... тем не менее, это может быть сделано!

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...