Gesplittetes Wort zusammenfügen

  • Themenstarter Themenstarter Bw2801
  • Beginndatum Beginndatum
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
 
//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? ")
 
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:
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?
 
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.
 
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?
 
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).
 

Zurück
Oben