Non vorrei usare un'espressione regolare:
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();
}
}
Da abbinare @ "spec" del JonSkeet:
Si noti che questo solo rimuovere i caratteri che sono duplicati alla fine. Ciò significa che le stringhe di carattere singolo non saranno toccati, ma le stringhe di due caratteri potrebbero diventare vuota se entrambi i personaggi sono gli stessi:
"" => ""
"x" => "x"
"xx" => ""
"aaaa" => ""
"ax" => "ax"
"abcd" => "abcd"
"abcdddd" => "abc"
mi chiedo se sarebbe possibile per raggiungere tale livello di controllo in una regex?
Aggiunto come risultato del ... ma Se usiamo questo regex con aaaa per esempio, non restituisce nulla. Dovrebbe tornare aaaa. commento:
Invece, l'uso:
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;
}
che ha il contratto:
"" => ""
"x" => "x"
"xx" => "xx"
"aaaa" => "aaaa"
"ax" => "ax"
"abcd" => "abcd"
"abcdddd" => "abc"
un solo personaggio si ripete? – Sam
L'ultimo carattere è sempre ripetuto? – Loamhoof
No, l'ultimo carattere non viene sempre ripetuto. Può avere una sequenza di almeno 2 caratteri alla fine. Un personaggio non è considerato ripetuto. –