Чтобы увидеть, является ли строка перестановкой 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
.
Смотри также