используя регулярное выражение в Java - PullRequest
2 голосов
/ 17 мая 2010

Мне нужно проверить строку, которая должна содержать только символы ABCDEFG, в любой последовательности и только с 7 символами. Пожалуйста, дайте мне знать правильный способ использования регулярного выражения.

как обычно я использую

String abs = "ABPID";
if(!Pattern.matches("[[ABCDEFG]", abs))
System.out.println("Error");

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

Ответы [ 2 ]

6 голосов
/ 17 мая 2010

Ровно 7 символов

"^[ABCDEFG]{7}$"

от 1 до 7 символов

"^[ABCDEFG]{1,7}$"
4 голосов
/ 17 мая 2010

Чтобы увидеть, является ли строка перестановкой ABCDEFG, легко с отрицательным прогнозированием и группой захвата принудить не дублировать:

^(?!.*(.).*\1)[A-G]{7}$

Вам не нужны якоря, если вы используете String.matches() в Java. Вот тестовый комплект:

    String[] tests = {
        "ABCDEFG", // true
        "GBADFEC", // true
        "ABCADFG", // false
    };
    for (String test : tests) {
        System.out.format("%s %b%n", test,
            test.matches("(?!.*(.).*\\1)[A-G]{7}")
        );
    }

В основном [A-G]{7}, но также (?!.*(.).*\1). То есть ни один символ не повторяется.

Вот тестовый комплект для утверждения, с которым можно поиграть:

    String[] tests = {
        "abcdeb", // "(b)"
        "abcdefg", // "abcdefg"
        "aba", // "(a)"
        "abcdefgxxxhijyyy" // "(y)"
    };
    for (String test : tests) {
        System.out.println(test.replaceAll("(?=.*(.).*\\1).*", "($1)"));
    }

Это работает, пытаясь сопоставить .*(.).*\1, то есть с .* между ними, захваченный символ (.), который появляется снова \1.

Смотри также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...