wake-up-neo.net

Entfernen Sie alle nicht alphabetischen Zeichen aus einem String-Array in Java

Ich versuche, eine Methode zu schreiben, die alle nicht alphabetischen Zeichen aus einem Java String[] entfernt und dann den String in einen String mit Kleinbuchstaben konvertiert. Ich habe versucht, mit regulären Ausdrücken das Auftreten aller nicht alphabetischen Zeichen durch "" zu ersetzen. Die Ausgabe, die ich erhalte, ist jedoch nicht möglich. Hier ist der Code

static String[] inputValidator(String[] line) {
    for(int i = 0; i < line.length; i++) {
       line[i].replaceAll("[^a-zA-Z]", "");
       line[i].toLowerCase();
    }
    return line;
}

Wenn ich jedoch versuche, eine Eingabe zu liefern, die nicht aus Alphabeten besteht (beispielsweise - oder .), besteht die Ausgabe auch aus diesen, da sie nicht entfernt werden.

Beispieleingabe

A dog is an animal. Animals are not people.

Ausgabe, die ich bekomme

A
dog
is
an
animal.
Animals
are
not
people.

Ausgabe, die erwartet wird

a
dog
is
an
animal
animals
are
not
people
19
hytriutucx

Das Problem ist, dass Ihre Änderungen nicht gespeichert werden, weil Strings unveränderlich sind. Jeder der Methodenaufrufe gibt eine neue String zurück, die die Änderung darstellt, wobei die aktuelle String gleich bleibt. Sie müssen lediglich die zurückgegebene String wieder im Array speichern.

line[i] = line[i].replaceAll("[^a-zA-Z]", "");
line[i] = line[i].toLowerCase();

Da jede Methode eine String zurückgibt, können Sie Ihre Methodenaufrufe miteinander verketten. Dadurch wird der zweite Methodenaufruf am Ergebnis des ersten ausgeführt, sodass Sie beide Aktionen in einer Zeile ausführen können.

line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase();
37
n00begon

Sie müssen das Ergebnis Ihrer Regex wieder den Zeilen [i] zuordnen.

for ( int i = 0; i < line.length; i++) {
  line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase();
}
5
paulsm4

Es funktioniert nicht, weil Zeichenfolgen unveränderlich sind. Sie müssen einen Wert festlegen Z.

line[i] = line[i].toLowerCase(); 
2
Sean F

Sie müssen das Ergebnis von toLowerCase() und replaceAll() wieder line[i] zuweisen, da Java String unveränderlich ist (der interne Wert ändert sich nie und die Methoden in der Klasse String geben ein neues String-Objekt zurück, anstatt das String-Objekt zu ändern.

2
nhahtdh

Wie schon gesagt, habe ich nur daran gedacht, einen weiteren Weg zu teilen, der hier nicht erwähnt wurde

 str = str.replaceAll("\\P{Alnum}", "").toLowerCase();
1
saurav

Eine coole (aber etwas umständliche, wenn Sie nicht gern gießende) Methode, um das zu tun, was Sie tun möchten, ist, die gesamte Zeichenfolge Index für Index zu durchlaufen und jedes Ergebnis von String.charAt (Index) in (Byte) und Überprüfen Sie dann, ob das Byte entweder a) im numerischen Bereich der alphabetischen Kleinbuchstaben (a = 97 bis z = 122) ist. In diesem Fall wandeln Sie es zurück in char und fügen Sie es einem String, einem Array oder einem anderen Element hinzu -have-you oder b) im numerischen Bereich der alphabetischen Großbuchstaben (A = 65 bis Z = 90). In diesem Fall fügen Sie 32 hinzu (A + 22 = 65 + 32 = 97 = a) und wandeln diese in um char und fügen Sie es hinzu. Wenn es sich in keinem dieser Bereiche befindet, verwerfen Sie es einfach.

1
CosmicComputer

Sie können auch Arrays.setAll dafür verwenden:

Arrays.setAll(array, i -> array[i].replaceAll("[^a-zA-Z]", "").toLowerCase());
0
Alex