Zeilenumbruch in einem String erzwingen

Aleyna23

Mitglied
Hallo *,

bräuchte einpaar Tips wie ich folgendes "Problemchen" mit Java (kein Javascript) lösen könnte.

Habe eine jsp mit einem Textarea-Html-Tag mit 5 Zeilen.
In diesen 5 Zeilen dürfen pro Zeile nur max. 70 Zeichen eingegeben werden.
Ab dem 70 ' ten Zeichen muss ein Zeilenumbruch erfolgen.
Aber es darf natürlich nicht mitten im Wort abgeschnitten werden, sondern das ganze letzte Wort müsste dann in die nächste Zeile übertragen werden. :confused:
Die Textarea darf eine maxLength von: 350 (5 x 70) Zeichen besitzen.

Habe da an einen String-Array[ ] gedacht, aber irgendwie fehlt mir die Idee, wie ich
es am Besten lösen könnte.

Danke im voraus :)
 
Hilft mir leider nicht weiter..
Vielleicht habe ich es auch nicht verständlich beschrieben.

Es soll in die textarea ein Text eingegeben werden (maxLength: 350).
Danach soll durch klick auf'n Button eine Action ausgeführt werden.
In dieser Action soll der String so gesplittet werden, dass nach 70 Zeichen ein Zeilenumbruch hinzugefügt wird (quasi ein \n). ABER es soll ja nicht direkt ab der 70'ten Stelle abgeschnitten werden. Das letzte Wort müsste in die nächste Zeile.
 
Also die Textarea kannst du Client-Seitig nur über JavaScript beeinflussen.

Server-Seitig musst Du dir wahrscheinlich selbst einen Algorithmus schreiben, der den String an entsprechender Stelle umbricht und evtl. Fehlermeldungen ausigbt.

Wo bzw. warum hier HTML im Spiel sein soll, weiß ich nicht... Vom Browser bekommst du von einer Textarea auf alle Fälle plain Text. Gedanken musst du Dir evtl. wegen den verschiedenen Zeilenumbruch-Zeichen (CR LF) machen (Windows, Linux, Mac, ...).

Ich würde den String aus der Textarea evtl. Zeichenweise einlesen, mir die Position des vorhergehenden Whitespace-Zeichens merken und entsprechend dieser Informationen einen neuen String zusammenbauen.

Am Besten auch etwas Google (Text Wrap, etc.)

zB http://forums.sun.com/thread.jspa?threadID=506456
 
Mit dem String-Array ist doch ne gute Idde. Du kannst ja nach dem " ", also dem leeren char triggern.
 
Hallo,
Du brauchst nicht Zeichenweise triggern
Java:
String s="ganz viel text ... "
String[] splitted = s.split(" ");

gibt dir ein String-Array das an den Leerzeichen aufgeteilt wurde, dann brauchst Du den Text nur noch über eine for-Schleife wieder zusammensetzen und dabei die Spaces und Umbrüche neu zu verteilen.

Übrigens split nimmt einen regulären Ausdruck entgegen, sollte es nicht reichen nur an den Leerzeichen zu splitten kann dieser entsprechend erweitert werden.
 
jup, ich muss mehrere Sachen prüfen, also nur Leerzeichen reichen nicht aus.
Habe in die Java Api geguckt wegen Regex, aber so ganz klar ist mir das nicht.

Wie muss denn der regex aussehen (für: leereichen, komma, doppelpunkt, bindestrich, punkt)

Pattern regex = Pattern.compile(?);
und brauch ich jetzt ein Matcher?
Sehe den Zusammenhang zu der Methode split() nicht. :-(

String str = "test text dsfdsufsdif sdfnsdifsdn fi nfdsnids. dfhdsufd sjdfi, dfhuhf."
String[] splitted = str.split(" ");
for(int i =0; i < array.length; i++){

}
 
Hellas!

Ein Problem wenn Du mit Punkten etc. trennst ist der Umstand, dass dir diese Information durch das Splitten verloren geht:

Ich habe kurz folgendes gebastelt:

Java:
        String str = "wort1 wort2, wort3: wort4-wort5. wort6";
        String[] splitted = str.split("([,:\\.] )|[ \\-]");
        for (int i = 0; i < splitted.length; i++) {
            System.out.println("splitted[" + i + "] = '" + splitted[i] + "'");
        }

Ausgabe:

Code:
splitted[0] = 'wort1'
splitted[1] = 'wort2'
splitted[2] = 'wort3'
splitted[3] = 'wort4'
splitted[4] = 'wort5'
splitted[5] = 'wort6'

Getrennt werden , : und . mit nachfolgendem Leerzeichen oder (|) Leerzeichen und Bindestrich.
 
Zuletzt bearbeitet von einem Moderator:
mein Vorschlag wäre in dem Fall erstmal hinter jedem Satzzeichen ein Space einzufügen und dann zu splitten:

Java:
String s= "wort1 wort2,wort3: wort4-wort5. wort6";
s = s.replaceAll("([,:\\.\\-])[ ]*", "$1 ");
String[] splitted = s.split(" ");

Code:
  splitted[0] = 'wort1'
splitted[1] = 'wort2,'
splitted[2] = 'wort3:'
splitted[3] = 'wort4-'
splitted[4] = 'wort5.'
splitted[5] = 'wort6

Für so eine einfache Sache brauchst Du nicht die Matcher/Pattern Klassen zu bemühen, das erledigen die Stringfunktionen für dich.
Das angegebene Pattern matcht auf die Zeichen: Komma, Doppelpunkt, Punkt, Bindestrich plus alle folgenden Leerzeichen(0 bis unendlich) und ersetzt sie durch das gefundene Zeichen ($1) und ein Leerzeichen.

Reguläre Ausdrücke sind sehr mächtig und ich kann nur jedem empfehlen sich damit zu beschäftigen. Sie sind einfacher als es am Anfang erscheinen mag!
 
Ich hab mich mal mit der Problematik auseinander gesetzt und folgendes ist bei mir rausgekommen:

Java:
package prozeilexzeichen;

import java.util.*;
import java.util.regex.*;

public class ProZeileXZeichen {
	public static void main(String[] args) {
		int maxLength;
		String str = null;
		List<String> strTmp = null;
		Pattern p = null;
		Matcher m = null;

		maxLength = 70;
		str = "Dies ist ein Test-Text. Ich hoffe, er macht seine Aufgabe gut und naja, mal schaun. Wie heißt es so schön: Probieren geht über studieren ^^ Also werd ich das auch mal versuchen xD";
		strTmp = new ArrayList<String>();
		p = Pattern.compile(".{1," + maxLength + "}$|.{1," + (maxLength - 1) + "}(\\.|,| )");
		/*
		 * Erklärung zum Regex
		 * 
		 * ".{1," + maxLength + "}$" = Die zu durchsuchende Zeichenkette endet
		 * mit einer Zeichenkette, die jedes x-beliebige Zeichen hat und eine
		 * maximale Länge von maxLength Zeichen hat.
		 * 
		 * "|" = oder
		 * 
		 * ".{1," + (maxLength - 1) + "}(\\.|,| )" = Eine Zeichenkette mit einer
		 * Länge von maxLength - 1 Zeichen, egal welche Zeichen als Inhalt und
		 * endet mit einem Punkt, einem Komma oder einem Leerzeichen.
		 */
		m = p.matcher(str);

		// Übereinstimmungen suchen und speichern
		while(m.find()) {
			strTmp.add(m.group());
		}

		// Ausgabe
		for(int i = 0; i < strTmp.size(); i++) {
			System.out.println(strTmp.get(i));
		}
	}
}

Der Regex-Kram ist ja kommentiert und sonst wüsste ich nicht, was dabei noch zu erklären wäre.
Aber ein Fall ist zu beachten, ich denk aber nicht, dass er eintreten wird. Es wird immer nur nach einem Ergebnis mit einer maximalen Zeichenkettenlänge von maxLength Zeichen gesucht. Das heißt, wenn in diesem Fall ein Wort länger sein sollte, als 70 Zeichen, dann werden nur die letzten 70 Zeichen übernommen, der vordere Teil wird also abgeschnitten. Ich hab dafür noch keine Lösung gefunden, aber wie gesagt, ich denke, das wird im Normalfall eh nicht eintreten.

Hoffe, das hilft dir ein wenig weiter...
 
Zuletzt bearbeitet:
Zurück