Wie Sie abschneiden einer Zeichenkette nach n-Wörter in Java?
Gibt es Bibliothek, eine routine für das abschneiden einer Zeichenfolge nach n Wörter? Ich bin auf der Suche nach etwas, dass können schalten Sie:
truncateAfterWords(3, "hello, this\nis a long sentence");
in
"hello, this\nis"
Könnte ich schreiben es selbst, aber ich dachte, so etwas könnte existieren bereits in einigen open-source-string-manipulation-Bibliothek.
Hier ist eine vollständige Liste der Testfälle, würde ich erwarten, dass jede Lösung zu übergeben:
import java.util.regex.*;
public class Test {
private static final TestCase[] TEST_CASES = new TestCase[]{
new TestCase(5, null, null),
new TestCase(5, "", ""),
new TestCase(5, "single", "single"),
new TestCase(1, "single", "single"),
new TestCase(0, "single", ""),
new TestCase(2, "two words", "two words"),
new TestCase(1, "two words", "two"),
new TestCase(0, "two words", ""),
new TestCase(2, "line\nbreak", "line\nbreak"),
new TestCase(1, "line\nbreak", "line"),
new TestCase(2, "multiple spaces", "multiple spaces"),
new TestCase(1, "multiple spaces", "multiple"),
new TestCase(3, " starts with space", " starts with space"),
new TestCase(2, " starts with space", " starts with"),
new TestCase(10, "A full sentence, with puncutation.", "A full sentence, with puncutation."),
new TestCase(4, "A full sentence, with puncutation.", "A full sentence, with"),
new TestCase(50, "Testing a very long number of words in the testcase to see if the solution performs well in such a situation. Some solutions don't do well with lots of input.", "Testing a very long number of words in the testcase to see if the solution performs well in such a situation. Some solutions don't do well with lots of input."),
};
public static void main(String[] args){
for (TestCase t: TEST_CASES){
try {
String r = truncateAfterWords(t.n, t.s);
if (!t.equals(r)){
System.out.println(t.toString(r));
}
} catch (Exception x){
System.out.println(t.toString(x));
}
}
}
public static String truncateAfterWords(int n, String s) {
//TODO: implementation
return null;
}
}
class TestCase {
public int n;
public String s;
public String e;
public TestCase(int n, String s, String e){
this.n=n;
this.s=s;
this.e=e;
}
public String toString(){
return "truncateAfterWords(" + n + ", " + toJavaString(s) + ")\n expected: " + toJavaString(e);
}
public String toString(String r){
return this + "\n actual: " + toJavaString(r) + "";
}
public String toString(Exception x){
return this + "\n exception: " + x.getMessage();
}
public boolean equals(String r){
if (e == null && r == null) return true;
if (e == null) return false;
return e.equals(r);
}
public static final String escape(String s){
if (s == null) return null;
s = s.replaceAll("\\\\","\\\\\\\\");
s = s.replaceAll("\n","\\\\n");
s = s.replaceAll("\r","\\\\r");
s = s.replaceAll("\"","\\\\\"");
return s;
}
private static String toJavaString(String s){
if (s == null) return "null";
return " \"" + escape(s) + "\"";
}
}
Gibt es Lösungen für diese auf dieser Website in anderen Sprachen:
- Ruby: Truncate string die ersten n Wörter
- PHP: Wie kann ich das abschneiden einer Zeichenfolge
- Ruby on Rails: Anzeige Nur der ersten x Wörter einer Zeichenfolge in rails
- Ich glaube nicht, dass es eine Funktion wie diese, die Aussehen wie etwas ganz besonderes.
- Sie können die Verwendung von split(), split-Worte auf " ", und dann zählen Sie Sie auf und wenn Sie mehr als 3, verwerfen Sie den rest. Aber Nein, ich habe noch nie auf etwas gestossen, wie dies bereits gemacht.
- Ich dachte an split, aber es neigt dazu, um Sie wegzuwerfen, das, was Sie auf Spalten. Ich will bewahren das Leerzeichen und neue Zeilen in der Zeichenfolge.
- anstelle der Verwendung von
String.spilt()
, ich würde es vorziehen, zu verwendenScanner
Klassenext()
. Als diespilt()
. Lesen Sie mehr zu diesem link - Meine Antwort unten funktioniert Prima mit Ihr bearbeitet input-string
hello, this\nis a long sentence
als gut. - Wenn es funktioniert, dann vergessen Sie nicht, markieren Sie es akzeptiert, wenn du kannst 😛
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie eine einfache regex-basierte Lösung:
Live-Demo: http://ideone.com/Nsojc7
Update: Basierend auf Ihre Kommentare, um Leistungsprobleme zu beheben:
Verwenden Sie folgende Methode, um eine bessere Leistung beim Umgang mit großen # der Worte:
truncateAfterWords(50, "Testing test testing as a test of testing testing more test.")
m.end()
. Machte noch ein edit, pls überprüfen Sie es jetzt.Fand ich einen Weg, es zu tun mit der java.text.BreakIterator Klasse:
Hier ist eine version, die verwendet reguläre Ausdrücke, um die nächste Reihe von Räumen in einer Schleife, bis es genug der Worte. Ähnlich wie die BreakIterator-Lösung, aber mit einem regulären Ausdruck zu Durchlaufen, das Wort bricht.
Versuchen Sie es mit regulären Ausdrücken in Java. Die regex nur abrufen n Worten:
(.*?\s){n}
.Versuchen Sie es mit dem code:
Mehr wissen über Pakete:
Matcher m = Pattern.compile("(.*?\\b){3}").matcher("hello, this is a long sentence");m.find();System.out.println(m.group(0));