it-swarm.com.de

so finden Sie vor und nach der Unterzeichenfolge in einer Zeichenfolge

Ich habe eine Zeichenfolge 123dance456, die ich in zwei Zeichenfolgen aufteilen muss, die die erste Unterzeichenfolge vor der Unterzeichenfolge dance (d. H. 123) und nach der Unterzeichenfolge dance (d. H. 456) enthalten. Ich muss sie finden und in separaten String-Variablen speichern, beispielsweise String firstSubString = 123; und String secondSubString = 456;.

Gibt es eine bestimmte String-Methode, die genau das tut?

22
skip

Sie können String.split(String regex) verwenden. Mach einfach so etwas:

String s = "123dance456";
String[] split = s.split("dance");
String firstSubString = split[0];
String secondSubString = split[1];

Wenn "dance" in der ursprünglichen Zeichenfolge mehr als einmal vorkommt, wird split() bei jedem Vorkommen aufgeteilt. Aus diesem Grund ist der Rückgabewert ein Array.

44
Alex D

Du kannst das:

String str = "123dance456";
String substr = "dance";
String before = str.substring(0, str.indexOf(substr));
String after = str.substring(str.indexOf(substr) + substr.length());

Oder

String str = "123dance456";
String substr = "dance";
String[] parts = str.split(substr);
String before = parts[0];
String after = parts[1];

Es ist bemerkenswert, dass die zweite Antwort nicht funktioniert, wenn der Teilstring mehr als einmal vorkommt. Wenn wir möchten, dass nur der erste erkannt wird, ist es sicherer, den Split mit einem Limit aufzurufen:

String[] parts = str.split(substr, 2);

dadurch wird sichergestellt, dass das zurückgegebene Array höchstens zwei Elemente enthält. Da split seine Eingabe als regulären Ausdruck interpretiert, müssen wir uns vor ungültiger regulärer Ausdruckssyntax hüten. Als solche wäre ich eher die erste Lösung, da sie unabhängig von der Zusammensetzung des ursprünglichen Teilstrings funktioniert.

Um die erste Antwort effizienter zu machen - da dies meine bevorzugte Antwort ist - müssen wir uns die Position des Teilstrings merken:

final int position = str.indexOf(substr);
if (position >= 0) {
    //if the substring does occur within the string, set the values accordingly
    before = str.substring(0, position);
    after = str.substring(position + substr.length());
} else {
    //otherwise, default to the empty string (or some other value)
    before = "";
    after = "";
}

Es lohnt sich immer, auf diese kleinen Edge-Fälle zu achten.

18
Milad Naseri

Wenn Sie commons-lang verwenden, lesen Sie StringUtils.substringAfter ().

5

Am einfachsten ist es, die split-Methode zu verwenden, wie die anderen Antworten nahelegen. Sie können auch eine Matcher und eine Pattern verwenden, um einen allgemeineren Ansatz zu erhalten:

String str = "123dance456";
String splitter = "dance";
Pattern p = Pattern.compile("(.*?)" + splitter + "(.*)");
Matcher m = p.matcher(str);
if (m.matches()) {
    firstSubString = m.group(1); // may be empty
    secondSubString = m.group(2); // may be empty
} else {
    // splitter not found in str
}
4
Ted Hopp
String[] data = new String("123dance456").split("dance");
1
kcdragon

Die Verwendung des Scanners ist eine schöne Alternative:

Scanner scanner = new Scanner( "123dance456" ).useDelimiter( "dance" );
if ( scanner.hasNext() )
  System.out.println( scanner.next() );
if ( scanner.hasNext() )
  System.out.println( scanner.next() );   

Es ist sehr praktisch, die Token als Stream zu verarbeiten und einfach über hasNext() nach neuen Token zu fragen. Sie erhalten auch nette Konvertierungen aus der Scanner, auch lokalisiert, wie:

Scanner scanner = new Scanner( "123dance456" ).useDelimiter( "dance" );
System.out.println( scanner.nextDouble() * scanner.nextDouble() );   
0