So teilen Sie den String "Thequickbrownfoxjumps"
in Java in gleich große Teilzeichenfolgen. Z.B. "Thequickbrownfoxjumps"
von 4 gleicher Größe sollte die Ausgabe geben.
["Theq","uick","brow","nfox","jump","s"]
Ähnliche Frage:
Teilen Sie die Zeichenfolge in Scala in gleichlange Teilzeichenfolgen auf
Antworten:
Hier ist die Regex-Einzeiler-Version:
\G
ist eine Behauptung mit einer Breite von Null, die mit der Position übereinstimmt, an der die vorherige Übereinstimmung beendet wurde. Wenn es war kein vorheriges Spiel, paßt es den Beginn des Eingangs, das gleiches wie\A
. Das beiliegende Erscheinungsbild entspricht der Position, die vier Zeichen vom Ende der letzten Übereinstimmung entfernt ist.Beide sehen gut aus und
\G
sind erweiterte Regex-Funktionen, die nicht von allen Geschmacksrichtungen unterstützt werden. Darüber hinaus\G
wird nicht konsistent über die Geschmacksrichtungen implementiert, die es unterstützen. Dieser Trick funktioniert (zum Beispiel) in Java , Perl, .NET und JGSoft, jedoch nicht in PHP (PCRE), Ruby 1.9+ oder TextMate (beide Oniguruma). JavaScript/y
(Sticky Flag) ist nicht so flexibel wie\G
und kann auf diese Weise nicht verwendet werden, selbst wenn JS Lookbehind unterstützt.Ich sollte erwähnen, dass ich diese Lösung nicht unbedingt empfehle , wenn Sie andere Optionen haben. Die Nicht-Regex-Lösungen in den anderen Antworten sind möglicherweise länger, aber sie dokumentieren sich auch selbst. Dies ist genau das Gegenteil davon. ;)
Dies funktioniert auch nicht in Android, was die Verwendung
\G
in Lookbehinds nicht unterstützt .quelle
String.substring()
anstelle eines regulären Ausdrucks, obwohl einige zusätzliche Codezeilen erforderlich sind, irgendwo in der Größenordnung von 5x schneller ausgeführt ...(?s)
im regulären Ausdruck ein Präfix stehen :(?s)(?<=\\G.{4})
.java.util.regex.PatternSyntaxException: Look-behind pattern matches must have a bounded maximum length
Nun, es ist ziemlich einfach, dies mit einfachen Arithmetik- und String-Operationen zu tun:
Ich denke nicht, dass es sich wirklich lohnt, einen regulären Ausdruck dafür zu verwenden.
EDIT: Meine Argumentation für die Verwendung eines regulären Ausdrucks:
quelle
Splitter.fixedLength(4)
benötigen , würde ich Guavas empfehlen, wie von Seanizer vorgeschlagen.Dies ist mit Google Guava sehr einfach :
Ausgabe:
Wenn Sie das Ergebnis als Array benötigen, können Sie diesen Code verwenden:
Referenz:
Splitter.fixedLength()
Splitter.split()
Iterables.toArray()
Hinweis: Die Splitterkonstruktion ist oben inline dargestellt. Da Splitter jedoch unveränderlich und wiederverwendbar sind, empfiehlt es sich, sie in Konstanten zu speichern:
quelle
String.join(separator, arrayOrCollection)
Wenn Sie die Guaven -Allzweckbibliotheken von Google verwenden (und ganz ehrlich, jedes neue Java-Projekt sollte es wahrscheinlich sein), ist dies mit der Splitter- Klasse wahnsinnig trivial :
und das wars . Einfach wie!
quelle
quelle
src.length()
undlen
beideint
s sind, erreicht Ihr Anrufceiling
nicht das, was Sie wollen - überprüfen Sie, wie einige der anderen Antworten dies tun: (src.length () + len - 1) / lenquelle
for
Schleifen?for
Schleife ist in der Tat eine "natürlichere" Wahl :-) Vielen Dank, dass Sie darauf hingewiesen haben.Sie können
substring
vonString.class
(Behandlung von Ausnahmen) oder von Apache lang Commons (es behandelt Ausnahmen für Sie) verwenden.Legen Sie es in eine Schleife und Sie können loslegen.
quelle
substring
Methode in der StandardklasseString
?Ich hätte lieber diese einfache Lösung:
quelle
substring
Implementierung wurde mit Java 7, Update 6 Mitte 2012 geändert, als die Felderoffset
undcount
aus derString
Klasse entfernt wurden. Die Komplexität wurde alsosubstring
lange vor dieser Antwort linear. Aber für eine kleine Saite wie das Beispiel läuft sie immer noch schnell genug und für längere Saiten… nun, diese Aufgabe tritt in der Praxis selten auf.Hier ist eine Einzeiler-Implementierung mit Java8-Streams:
Es gibt die folgende Ausgabe:
quelle
String[] result = IntStream.range(0, (input.length()+3)/4) .mapToObj(i -> input.substring(i *= 4, Math.min(i + 4, input.length()))) .toArray(String[]::new);
Hier ist ein Einzeiler - Version , die verwendet Java 8 IntStream die Indizes der Scheibe Anfänge zu bestimmen:
quelle
Im Fall , dass Sie die Zeichenfolge gleich nach hinten, also von rechts nach links, zum Beispiel spalten, zu spalten
1010001111
zu[10, 1000, 1111]
, hier ist der Code:quelle
Ich benutze die folgende Java 8-Lösung:
quelle
Java 8-Lösung ( so, aber etwas einfacher):
quelle
Ich fragte @Alan Moore in einem Kommentar zur akzeptierten Lösung, wie Zeichenfolgen mit Zeilenumbrüchen behandelt werden könnten. Er schlug vor, DOTALL zu verwenden.
Mit seinem Vorschlag habe ich eine kleine Auswahl erstellt, wie das funktioniert:
Aber ich mag auch die @ Jon Skeets-Lösung in https://stackoverflow.com/a/3760193/1237974 . Für die Wartbarkeit in größeren Projekten, in denen nicht jeder gleichermaßen Erfahrung mit regulären Ausdrücken hat, würde ich wahrscheinlich die Jons-Lösung verwenden.
quelle
Eine andere Brute-Force-Lösung könnte sein:
Wobei der Code nur mit Teilzeichenfolgen durch die Zeichenfolge tritt
quelle
Ergebnis
quelle
quelle
Hier ist meine Version, die auf RegEx- und Java 8-Streams basiert. Es ist erwähnenswert, dass die
Matcher.results()
Methode seit Java 9 verfügbar ist.Test enthalten.
quelle
quelle
quelle