Zerlegt einen String in Java in Teilstrings gleicher Länge, während Wortgrenzen beibehalten werden

8

Wie teilt man eine Zeichenkette in gleiche Teile der maximalen Zeichenzahl unter Beibehaltung der Wortgrenzen?

Sagen Sie zum Beispiel, wenn ich eine Zeichenfolge "Hallo Welt" in gleiche Teilstrings von maximal 7 Zeichen teilen möchte, sollte es mich zurückgeben

%Vor%

und

%Vor%

Aber meine aktuelle Implementierung gibt

zurück %Vor%

und

%Vor%

Ich verwende den folgenden Code aus Zeichenfolge auf gleiche Länge aufteilen Teilstrings in Java , um die Eingabezeichenfolge in gleiche Teile aufzuteilen

%Vor%

Wird es möglich sein, Wortgrenzen beizubehalten, während die Zeichenfolge in Teilstrings aufgeteilt wird?

Um genauer zu sein, brauche ich den String-Splitting-Algorithmus, um die durch Leerzeichen bereitgestellte Wortgrenze zu berücksichtigen und nicht nur auf die Zeichenlänge zu vertrauen, obwohl diese auch berücksichtigt werden muss, aber eher wie ein maximaler Bereich von Zeichen statt einer fest codierten Zeichenlänge.

    
Nav 15.09.2014, 17:18
quelle

2 Antworten

16

Wenn ich Ihr Problem richtig verstehe, sollte dieser Code das tun, was Sie brauchen (aber vorausgesetzt, maxLenght ist gleich oder größer als das längste Wort )

%Vor%

Ausgabe:

%Vor%

Kurze (oder nicht) Erklärung von "\G\s*(.{1,"+maxLenght+"})(?=\s|$)" regex:

(Erinnern wir uns, dass in% \ nicht nur in regex, sondern auch in String-Literalen etwas Besonderes ist. Um also vordefinierte Zeichensätze wie \d zu verwenden, müssen wir es als "\d" schreiben, weil wir fliehen mussten das \ auch in String-Literal)

  • \G - ist der Anker, der das Ende der zuvor erstellten Übereinstimmung darstellt, oder wenn es noch keine Übereinstimmung gibt (wenn wir gerade erst angefangen haben zu suchen), beginnt der String (wie ^ )
  • \s* - steht für null oder mehr Leerzeichen ( \s steht für Leerzeichen, * "Null- oder mehr" Quantifizierer)
  • (.{1,"+maxLenght+"}) - lässt es in mehrere Teile aufteilen (zur Laufzeit wird :maxLenght einen numerischen Wert wie 10 enthalten, damit Regex es als .{1,10} sieht)
    • . steht für ein beliebiges Zeichen (tatsächlich kann es standardmäßig ein beliebiges Zeichen außer Zeilentrennzeichen wie \n oder \r darstellen, aber dank Pattern.DOTALL flag kann es jetzt jedes Zeichen darstellen - ) los von dieser Methode Argument, wenn Sie beginnen wollen, jeden Satz separat zu spalten, da sein Start in jeder neuen Zeile trotzdem gedruckt wird )
    • {1,10} - das ist ein Quantifizierer, der das zuvor beschriebene Element 1 bis 10 Mal erscheinen lässt (standardmäßig wird versucht, die maximale Anzahl übereinstimmender Wiederholungen zu finden),
    • .{1,10} - also basierend auf dem, was wir gerade gesagt haben, repräsentiert es einfach "1 bis 10 beliebige Zeichen"
    • ( ) - Klammern erstellen Gruppen , Strukturen, die es uns erlauben, bestimmte Teile der Übereinstimmung zu halten (hier wir Klammern nach \s* hinzugefügt, weil wir nur Teile nach Leerzeichen verwenden möchten)
  • (?=\s|$) - ist ein Look-ahead Mechanismus, der sicherstellt, dass der Text von% co_de übereinstimmt % wird danach haben:

    • Leerzeichen ( .{1,10} )

      ODER (geschrieben als \s )

    • Ende der Zeichenfolge | danach.

Also, dank $ können wir bis zu 10 Zeichen zuordnen. Aber mit .{1,10} danach brauchen wir, dass das letzte Zeichen, das mit (?=\s|$) übereinstimmt, nicht Teil des unvollendeten Wortes ist (dahinter muss ein Leerzeichen oder ein Ende der Zeichenkette stehen).

    
Pshemo 15.09.2014, 18:02
quelle
1

Nicht-Regex-Lösung, nur für den Fall, dass jemand besser (?) keine regulären Ausdrücke verwendet:

%Vor%

Test:

%Vor%

Ausgabe:

%Vor%

Es berücksichtigt Wörter, die länger als das festgelegte Limit sind, also überspringt es sie nicht (im Gegensatz zur Regex-Version, die die Verarbeitung nur stoppt, wenn supercalifragilisticexpialidosus gefunden wird).

PS: Der Kommentar, dass alle eingegebenen Wörter kürzer als das eingestellte Limit sein sollten, wurde gemacht, nachdem ich diese Lösung gefunden hatte;)

    
walen 19.09.2016 09:04
quelle

Tags und Links