Zeichenfolge in Java trimmen, während das vollständige Wort beibehalten wird

8

Ich muss einen String in Java trimmen, so dass:

  

Der schnelle braune Fuchs springt über den faulen Hund.

wird

  

Die schnelle braune ...

Im Beispiel oben trimm ich auf 12 Zeichen. Wenn ich nur Teilzeichenfolge verwende, würde ich erhalten:

  

Der schnelle Br ...

Ich habe bereits eine Methode, um dies mit Substring zu tun, aber ich wollte wissen, was der schnellste (effizienteste) Weg ist, dies zu tun, weil eine Seite viele Trim-Operationen haben kann.

Der einzige Weg, an den ich denken kann, ist, die Zeichenfolge in Leerzeichen aufzuteilen und sie wieder zusammenzusetzen, bis ihre Länge die angegebene Länge überschreitet. Gibt es eine andere Art und Weise? Vielleicht eine effizientere Methode, mit der ich die gleiche Methode verwenden kann, um eine "weiche" Trimmung vorzunehmen, wobei ich das letzte Wort (wie im obigen Beispiel gezeigt) und eine harte Trimmung, die ein Teilstring ist, beibehalten.

Danke,

    
AMZFR 12.10.2011, 09:47
quelle

7 Antworten

11

Unten ist eine Methode, mit der ich lange Strings in meinen Webapps trimmen kann. Das "weiche" boolean , wie du es ausdrückst, wenn es auf true gesetzt wird, behält das letzte Wort bei. Dies ist die prägnanteste Art, dies zu tun, die ich verwenden könnte, die einen StringBuffer verwendet, der viel effizienter ist als die Wiederherstellung einer unveränderlichen Zeichenkette.

%Vor%

Aktualisieren

Ich habe den Code so geändert, dass der ... im StringBuffer angehängt wird, um unnötige Kreationen von String implizit zu verhindern, was langsam und verschwenderisch ist.

Hinweis: escapeHtml ist ein statischer Import aus Apache commons:

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;

Sie können es entfernen und der Code sollte gleich funktionieren.

    
Ali 12.10.2011, 09:50
quelle
7

Hier ist eine einfache, regexbasierte 1-Linien-Lösung:

%Vor%

Erläuterung:

  • (?<=.{12}) ist ein negativer Look hinter , der angibt, dass sich mindestens 12 Zeichen links von der Übereinstimmung befinden, aber es handelt sich um eine nicht erfassende (dh nullbreite) Übereinstimmung
  • \b.* entspricht der ersten Wortgrenze (nach mindestens 12 Zeichen - oben) bis zum Ende

Dies wird durch "..."

ersetzt

Hier ist ein Test:

%Vor%

Ausgabe:

%Vor%     
Bohemian 12.10.2011 09:54
quelle
4

Bitte versuchen Sie folgenden Code:

%Vor%     
Tran Dinh Thoai 12.10.2011 10:02
quelle
0

Versuchen Sie, nach dem letzten Vorkommen eines Speicherplatzes zu suchen, der sich in einer Position von weniger oder mehr als 11 befindet, und schneiden Sie die Zeichenfolge dort ab, indem Sie "..." hinzufügen.

    
ikromm 12.10.2011 09:50
quelle
0

Ihre Anforderungen sind nicht klar. Wenn Sie Schwierigkeiten haben, sie in einer natürlichen Sprache zu artikulieren, ist es nicht überraschend, dass sie schwer in eine Computersprache wie Java zu übersetzen sind.

"Bewahre das letzte Wort" impliziert, dass der Algorithmus weiß, was ein "Wort" ist, also musst du es zuerst sagen. Die Trennung ist eine Möglichkeit, dies zu tun. Ein Scanner / Parser mit einer Grammatik ist ein anderer.

Ich würde mir Sorgen machen, dass es funktioniert, bevor ich mich um Effizienz kümmere. Lass es funktionieren, messe es und sieh dann, was du mit Leistung machen kannst. Alles andere ist Spekulation ohne Daten.

    
duffymo 12.10.2011 09:50
quelle
0

Wie wäre es mit:

%Vor%     
Highly Irregular 12.10.2011 09:51
quelle
0

Ich benutze diesen Hack: Angenommen, der getrimmte String muss eine Länge von 120 haben:

%Vor%     
kylexy1357 12.01.2015 11:10
quelle

Tags und Links