Gesplittetes Wort zusammenfügen

B

Bw2801

Gast
Hallo Leute,
ich arbeite an etwas, das einen Satz überarbeitet.
Java:
String input = "Ha llo, wie geht es dir?";
//beachtet, dass das Wort Hallo mit absicht auseinandergeschrieben wurde.
//der Input verändert sich natürlich später durch eine Eingabe.
String replace = "Hallo"
Nun möchte ich, dass "Ha llo" mit dem String "Hallo" replaced wird. Ist es möglich, herauszufinden, ob ein Wort ein ODER mehrere Leerzeichen beinhaltet? Also, dass als Input zum beispiel auch "H a llo" oder "Ha l lo" verwendet werden könnte? Wenn ja, bitte helft mir, oder gebt mir zumindest Anregungen, wie ich das lösen könnte

Mit freundlichen Grüßen
Bw2801
 
B

Bw2801

Gast
//EDIT: Als Output sollte also immer "Hallo wie geht es dir?" rauskommen (unter der Vorraussetzung, dass der Input "<eine Form von Hallo> wie geht es dir? ")
 

xehpuk

Top Contributor
Code:
\s*
heißt als regulärer Ausdruck "beliebige Anzahl von Leerzeichen". Im genannten Beispiel müsste man also "Hallo" in "H\\s*a\\s*l\\s*l\\s*o" umwandeln und durch "Hallo" ersetzen:
Java:
public class Replace {
	public static String replace(final String source, final String search) {
		final int length = search.length();
		if (length < 2)
			return source;
		final StringBuilder sb = new StringBuilder(4 * length - 3);
		for (int i = 0; i < length - 1; i++) {
			sb.append(search.charAt(i));
			sb.append("\\s*");
		}
		sb.append(search.charAt(length - 1));
		return source.replaceAll(sb.toString(), search);
	}
	
	public static void main(String... args) {
		final String input = "Ha llo, wie geht es dir?";
		final String replace = "Hallo";
		final String output = replace(input, replace);
		System.out.println(output);
	}
}
Dies könnte problematisch werden, wenn sich das Wort zufälligerweise durch das Ende und den Anfang von zwei aufeinander folgenden Wörtern zusammensetzt. Nimmt man bspw. den bereits genannten Eingabesatz und als zu suchendes Wort "wiege", dann wird das Leerzeichen zwischen "wie" und "geht" gelöscht.
Da müsste man noch ein bisschen mehr Logik reinbringen, um Wortgrenzen zu erkennen.
 
Zuletzt bearbeitet:
B

Bw2801

Gast
Code:
\s*
heißt als regulärer Ausdruck "beliebige Anzahl von Leerzeichen". Im genannten Beispiel müsste man also "Hallo" in "H\\s*a\\s*l\\s*l\\s*o" umwandeln und durch "Hallo" ersetzen:
Java:
public class Replace {
	public static String replace(final String source, final String search) {
		final int length = search.length();
		if (length < 2)
			return source;
		final StringBuilder sb = new StringBuilder(4 * length - 3);
		for (int i = 0; i < length - 1; i++) {
			sb.append(search.charAt(i));
			sb.append("\\s*");
		}
		sb.append(search.charAt(length - 1));
		return source.replaceAll(sb.toString(), search);
	}
	
	public static void main(String... args) {
		final String input = "Ha llo, wie geht es dir?";
		final String replace = "Hallo";
		final String output = replace(input, replace);
		System.out.println(output);
	}
}
Dies könnte problematisch werden, wenn sich das Wort zufälligerweise durch das Ende und den Anfang von zwei aufeinander folgenden Wörtern zusammensetzt. Nimmt man bspw. den bereits genannten Eingabesatz und als zu suchendes Wort "wiege", dann wird das Leerzeichen zwischen "wie" und "geht" gelöscht.
Da müsste man noch ein bisschen mehr Logik reinbringen, um Wortgrenzen zu erkennen.

Ok, soweit schonmal danke. AAber ich habe ein Problem: Wenn man als Input "Hall o" eingibt, kommt auch "Hall o" raus, aber wenn man "Hallo Hall o" eingibt, werden beide Hallos zu "Hallo" replaced.
Warum ist das so, irgendeine idee?
 

xehpuk

Top Contributor
Das habe ich jetzt nicht verstanden. Bei "Hall o" kommt "Hallo" (nicht "Hall o") raus, bei "Hallo Hall o" kommt "Hallo Hallo" (nicht "Hallo") raus.
 
B

Bw2801

Gast
Das habe ich jetzt nicht verstanden. Bei "Hall o" kommt "Hallo" (nicht "Hall o") raus, bei "Hallo Hall o" kommt "Hallo Hallo" (nicht "Hallo") raus.

Ok, ich arbeite an einem Plugin für Bukkit (weiß nicht, ob dus kennst). Das hier ist mein code:
Java:
String input = event.getMessage();
String output = replace(input, key.toLowerCase());
input = output.replaceAll(wordd, wordd.toLowerCase().replaceAll(key.toLowerCase(), replace));
String message = output, wordd.replaceAll(" ", "").toLowerCase(), replace));

So... und wenn jetzt als Message(Input) "shit" eingegeben wird, wird das durch "****" ersetzt. Wenn ich aber "shi t" eingebe, kommt als message "shi t" raus. Wenn ich aber als Input "shit shi t" eingebe, dann kommt das hier raus: "**** ****". Das beweist zwar, dass er erkennt, dass "shi t" ein Wort ist, aber warum replaced der das nicht, wenn ich nur "shi t" eingebe?
 

xehpuk

Top Contributor
Ich blicke jetzt nicht ganz durch deinen Code bzw. was du damit erreichen willst. Anscheinend willst du bestimmte Wörter zensieren? Dafür eignet sich die bisherige Methode ja nicht, da sie das Wort nur wieder zusammensetzt. Mit einer kleinen Änderung wird das gesuchte Wort durch Sternchen ersetzt:
Java:
public class Replace {
    public static String replace(final String source, final String search) {
        final int length = search.length();
        if (length < 2)
            return source;
        final StringBuilder sb = new StringBuilder(4 * length - 3);
        for (int i = 0; i < length - 1; i++) {
            sb.append(search.charAt(i));
            sb.append("\\s*");
        }
        sb.append(search.charAt(length - 1));
        return source.replaceAll(sb.toString(), substitutionWord(length));
    }
	
	private static String substitutionWord(final int length) {
		return duplicateChar('*', length);
	}
	
	private static String duplicateChar(final char c, final int length) {
		final StringBuilder sb = new StringBuilder(length);
		for (int i = 0; i < length; i++)
			sb.append(c);
		return sb.toString();
	}
    
    public static void main(String... args) {
        final String input = "Ha llo, wie geht es dir? Hallo!";
        final String replace = "Hallo";
        final String output = replace(input, replace);
        System.out.println(output);
    }
}
Code:
*****, wie geht es dir? *****!
Weil ich es noch nicht erwähnt habe: Falls im Suchstring auch Metazeichen für Regex vorkommen könnten, musst du ihn vorher mit Backslashes escapen. Ebenso beim Ersatzwort, das eingefügt wird ("$" und "\" sind dort Metazeichen).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
buchfrau Anagram für beliebiges Wort Allgemeine Java-Themen 2
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
The Pi Wie oft wird ein Buchstabe in einem Wort wiederholt? Allgemeine Java-Themen 16
4a61766120617274697374 PDF iText Wort Koordinaten auslesen Allgemeine Java-Themen 1
T Textarea nach nur 1 wort durchsuchen Allgemeine Java-Themen 3
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
M Methode um ein Wort raus zu schneiden? Allgemeine Java-Themen 3
J Doppelte Buchstaben löschen - letztes Wort macht er nicht Allgemeine Java-Themen 2
H Scanner soll einen Inputredirect einlesen, liest aber nicht jedes Wort ein. Allgemeine Java-Themen 3
M Ein bestimmtes Wort in einem Text zählen (String in String) Allgemeine Java-Themen 9
D Wort in Text mit >100.000 Wörter finden Allgemeine Java-Themen 7
F Char-Array nach einem Wort durchsuchen! Allgemeine Java-Themen 11
G Wort am Bildschirm -- Koordinaten suchen Allgemeine Java-Themen 2
D readChar; wort abspeichern :( Allgemeine Java-Themen 5
A Wort in seine Buchstaben zerlegen Allgemeine Java-Themen 37
E Wort kodieren mit bit shifting? Allgemeine Java-Themen 6
T bestimmtes wort aus string lesen Allgemeine Java-Themen 12
M String lässt sich nicht Zusammenfügen Allgemeine Java-Themen 10
N 2 Objekte zu einer Gruppe zusammenfügen Allgemeine Java-Themen 7
M wav-files kanäle zusammenfügen + pitchen Allgemeine Java-Themen 6
F 2 Strings zusammenfügen Allgemeine Java-Themen 2
S Streams zusammenfügen Allgemeine Java-Themen 4
E Aus mehreren PDFs eines machen, zusammenfügen mittels iText Allgemeine Java-Themen 1
H XML-Docs in StringArrayzu einem String zusammenfügen Allgemeine Java-Themen 8
G 2 Objekte der selben Klasse zusammenfügen und alte Referenz Allgemeine Java-Themen 19
H Dringend: Jasper Reports - Zusammenfügen von PDFs ? Allgemeine Java-Themen 4
L zwei html dateien vegleichen und zu einer html zusammenfügen Allgemeine Java-Themen 7

Ähnliche Java Themen


Oben