Input/Output Leerzeichen aus String entfernen - klappt nicht!

HolyFUT

Mitglied
Hallo zusammen,
ich stoße gerade auf ein recht frustrierendes Problem und weiß hier nicht mehr weiter.

Ich habe einen WebSocket Server, geschrieben mit der Jakarat und Tyrus API. Meine Anfragen an den WebSocket Server werden mittels JavaScript in einer HTML gesendet. In meiner HTML Datei habe ich ein Formular mit zwei Eingabefelder. Eines in dem man seinen Benutzername angeben kann und eines für eine Textnachricht. Die Daten werden als JSON Objekt an meinen WebSocket Server gesendet. Ich möchte nun die Textnachricht auswerten und zwischen einem Chatbefehl, der mit einem Slash eingeleitet wird, oder einer normalen Textnachricht unterscheiden.

Zuerst empfange ich die Client Eingabe über meine Annotation @OnMessage

Java:
@OnMessage
public void onMessage(JsonObject data, Session session) {
    String message = data.get("chatInput").toString();
    Command command = new Command().listenForCommands(message);
 }

Hier kann man schon sehen, dass meine Methode onMessage ein JsonObject erwartet. In der ersten Zeile möchte ich eine neue Variable namens message mit dem JsonValue, der als String gecastet wird, aus dem JsonObject der Chatnachricht (dessen Key chatInput lautet) initialisieren. Anschließend instanziiere ich meine Klasse Command und rufe die Methode listernForCommands auf. Diese Methode soll nun, in der Theorie, den Unterschied zwischen Chatbefehl und normaler Textnachricht herausfinden.

Meine Nachricht sieht beispielsweise so aus: " A " (ohne die Anführungszeichen!)

Zunächst wollte ich aber die unnötiges Whitespaces, links vor Anfang des ersten Characters und Rechts nach letzten Character, rauslöschen indem ich den Befehl trim() verwende.

Code:
 public Command listenForCommands(String message) {
     message = message.trim();
}

Das klappt jedoch nicht, hier werden gar keine Whitespaces entfernt.

Ich habe es anschließend mit str.replaceAll probiert.

Code:
public Command listenForCommands(String message) { 
     message = message.replaceAll(" ", message);
}

Das hat auch nicht geklappt, ich habe hier auch mehrere regex Optionen verwendet: \t, \n, \r, \n (alle mit doppelten Backslash)

Ich habe es auch mit folgenden Unicode characters als Regex probiert: \u0009, \u000A, \u000B
Oder auch das hier: \\s
Letzteres gibt mir das hier aus: "" A"" A"A"

Ich weiß nicht mehr wirklich weiter, wie kann ich dieses Problem am besten angehen?
 
Das hat auch nicht geklappt, ich habe hier auch mehrere regex Optionen verwendet: \t, \n, \r, \n (alle mit doppelten Backslash)
für führende und folgende leerzeichen funktiniert definitiv trim

dein string replace all wäre blöd für deine commands, da du eig nur nach gewissen kriterien sachen entscheiden kannst ohne in komplexität zu eskalieren
 
Doch, werden sie. Der Parameter message innerhalb der Methode zeigt anschließend auf einen String ohne führende und abschließende Leerzeichen.
Moin, dass tut er leider nicht. Ich habe das Ergebnis ja geprüft 😀

Was ich festgestellt habe:
Java:
System.out.println(command.listenForCommands(" Hallo !"));
System.out.println(command.listenForCommands(message));
Zeile 1 entfernt mit trim die führenden und abschließenden Whitespaces
Zeile 2 hingegen nicht...

1653231101284.png

Was hat es mit den Anführungszeichen in der Konsolen-Ausgabe auf sich? Sind das vielleicht die Anführungszeichen des JSON Objekt?

Eine weitere Info:
str.replaceAll funktioniert! Ich hab im zweiten Parameter meine message Variable als replacement angegen... Ich würde aber gerne trim verwenden.
 
ja aber wenn du ein command terminal oder allgemein ocommandos mit parameter bauen willst dann willst du die leerzeichen haben
Korrekt, deswegen wollte ich auch str.replaceAll nicht verwenden 😀 Wobei ich hier natürlich auch die einzelnen Nachrichten in Arrays auslagern und dann validieren kann.

wahrscheinlich hast du da was an der übermittlung versaubeutelt
Mh, weiß du vielleicht was?

Javascript:
const chatInput = (chatValue ? chatValue : "");
const username = (usernameValue ? usernameValue : "guest");
userData = { "username": username, "chatInput": chatInput };
sendWebSocketMessage(JSON.stringify(userData));

Für mich siehts erstmal wie ein normales JSON Objekt aus...
 
Was mir auffällt: Du sagst, dass es keine führenden Quotes gibt:
Meine Nachricht sieht beispielsweise so aus: " A " (ohne die Anführungszeichen!)
Aber bei der Ausgabe zeigst Du uns, dass die erste Zeile keine Quotes hat, die zweite aber schon. Da der Aufruf der Gleiche ist, kommen die Quotes der Ausgabe nicht vom Code, der die Ausgabe macht. Somit müssen diese noch Teil von message sein. Wenn da Quote Zeichen sind, dann macht trim() natürlich nichts, denn erstes und letztes Zeichen ist ein Quote und kein Leerzeichen.
 
Wenn du einen Wert, der bereits ein String ist, mittels JSON.stringify() als JSON kodierst, dann hat das Ergebnis natürlich Anführungszeichen, weil das eben Teil der Kodierung eines strings in json ist.
Ein JSON String hat immer Anführungszeichen.
Moin,
also mit JSON.stringify kodiere ich ja nichts zu JSON, sondern codiere es zu einem JSON-String. Und einen String kodiere ich ebenfalls nicht, in dem Fall kodiere ich ein JavaScript Objekt in einen JSON-String.
Aber bei der Ausgabe zeigst Du uns, dass die erste Zeile keine Quotes hat, die zweite aber schon.
Danke für die Info, dass mit den Quotes hatte ich jetzt auch festgestellt nachdem mir yfons dazu was gesagt hatte. Ich habe jetzt mal in meinem Server die Anführungszeichen mittels replaceAll entfernt und das Ergebnis getrimmt - jetzt funktioniert es. Müsste jetzt nur schauen wie ich meine Übermittlung gedeichselt kriege, denn ich würde gerne ohne dem replaceAll auskommen, kann ja sein dass die Nachricht auch eben Anführungszeichen beinhalten kann.

Edit: Ich dachte die Quotes werden von Java ausgegeben, weil es sich hier um ein String handelt haha
 
Zuletzt bearbeitet:
also mit JSON.stringify kodiere ich ja nichts zu JSON, sondern codiere es zu einem JSON-String.
Gut, wenn Du auf genaue Bezeichnungen achtest (im MDN ist das auch ungenau). Im ECMAscript-Standard wird hier allerdings zwischen JSON Text und JSON String unterschieden.

"X" wäre gültiger JSON Text, der einen JSON-String darstellt. {} wäre gültiger JSON Text, der ein JSON-Objekt darstellt.
 

Neue Themen


Zurück
Oben