Я бы не использовать регулярное выражение:
public class Test {
public void test() {
System.out.println(removeTrailingDupes("abcdaaaaefghaaaaaaaaa"));
System.out.println(removeTrailingDupes("012003400000000"));
System.out.println(removeTrailingDupes("0120034000000001"));
System.out.println(removeTrailingDupes("cc"));
System.out.println(removeTrailingDupes("c"));
}
private String removeTrailingDupes(String s) {
// Is there a dupe?
int l = s.length();
if (l > 1 && s.charAt(l - 1) == s.charAt(l - 2)) {
// Where to cut.
int cut = l - 2;
// What to cut.
char c = s.charAt(cut);
while (cut > 0 && s.charAt(cut - 1) == c) {
// Cut that one too.
cut -= 1;
}
// Cut off the repeats.
return s.substring(0, cut);
}
// Return it untouched.
return s;
}
public static void main(String args[]) {
new Test().test();
}
}
Чтобы соответствовать @ «спецификации» JonSkeet в:
Обратите внимание, что это будет только удалить символы, которые дублированы в конце. Это означает, что строки одиночного символа не будут затронуты, но строки двухзнаковых могут стать пустыми, если оба персонажа одинаковы:
"" => ""
"x" => "x"
"xx" => ""
"aaaa" => ""
"ax" => "ax"
"abcd" => "abcd"
"abcdddd" => "abc"
Интересно, если можно было бы достичь такого уровня контроля в регулярном выражении?
Добавлено в результате ... но Если мы используем это регулярное выражение с aaaa, например, оно ничего не возвращает. Он должен вернуть aaaa. комментарий:
Вместо этого используйте:
private String removeTrailingDupes(String s) {
// Is there a dupe?
int l = s.length();
if (l > 1 && s.charAt(l - 1) == s.charAt(l - 2)) {
// Where to cut.
int cut = l - 2;
// What to cut.
char c = s.charAt(cut);
while (cut > 0 && s.charAt(cut - 1) == c) {
// Cut that one too.
cut -= 1;
}
// Cut off the repeats.
return cut > 0 ? s.substring(0, cut): s;
}
// Return it untouched.
return s;
}
, который имеет контракт:
"" => ""
"x" => "x"
"xx" => "xx"
"aaaa" => "aaaa"
"ax" => "ax"
"abcd" => "abcd"
"abcdddd" => "abc"
только один символ повторяется? – Sam
Повторяется ли последний символ? – Loamhoof
Нет, последний символ не всегда повторяется. Он может иметь последовательность не менее 2 символов в конце. Один символ не считается повторенным. – 2013-04-02 13:48:09