webentwicklung-frage-antwort-db.com.de

Wie bekomme ich in Java einen Teilstring von einem String bis zu einem Zeichen c?

Ich habe eine Zeichenfolge (im Wesentlichen ein Dateiname, der einer Namenskonvention folgt). abc.def.ghi

Ich möchte den Teilstring vor dem ersten . extrahieren (dh einen Punkt)

In Java doc api kann ich scheinbar keine Methode in String finden, die dies tut.
Vermisse ich etwas? Wie es geht?

76
xyz

siehe String.indexOf und String.substring

Stellen Sie sicher, dass Sie nach -1 für indexOf suchen.

52
TofuBeer

Sie können nur teilen die Zeichenfolge ..

public String[] split(String regex)

Beachten Sie, dass Java.lang.String.split den regulären Ausdruckswert des Begrenzers ..__ verwendet. Im Wesentlichen wie folgt ...

String filename = "abc.def.ghi";     // full file name
String[] parts = filename.split("\\."); // String array, each element is text between dots

String beforeFirstDot = parts[0];    // Text before the first dot

Natürlich ist dies aus Gründen der Klarheit in mehrere Zeilen aufgeteilt. Es könnte geschrieben werden als

String beforeFirstDot = filename.split("\\.")[0];
76
Chad Schouggins

Die akzeptierte Antwort ist korrekt, aber Sie erfahren nicht, wie Sie sie verwenden sollen. So verwenden Sie die Funktionen indexOf und substring zusammen.

String filename = "abc.def.ghi";     // full file name
int iend = filename.indexOf("."); //this finds the first occurrence of "." 
//in string thus giving you the index of where it is in the string

// Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is found. 
//So check and account for it.

String subString;
if (iend != -1) 
{
    subString= filename.substring(0 , iend); //this will give abc
}
75
Sam B

Wenn Ihr Projekt bereits commons-lang verwendet, bietet StringUtils eine Nice-Methode für diesen Zweck:

String filename = "abc.def.ghi";

String start = StringUtils.substringBefore(filename, "."); // returns "abc"

siehe Javadoc [2.6][3.1]

46
Max Fichtelmann

oder du probierst sowas aus

"abc.def.ghi".substring(0,"abc.def.ghi".indexOf(c)-1);

11
Umer Hayat

Wie wäre es mit Regex?

String firstWord = filename.replaceAll("\\..*","")

Dies ersetzt alles vom ersten Punkt bis zum Ende durch "" (dh es löscht es und lässt Sie mit, was Sie wollen)

Hier ist ein Test:

System.out.println("abc.def.hij".replaceAll("\\..*", "");

Ausgabe:

abc
3
Bohemian

In Java.lang.String erhalten Sie einige Methoden wie indexOf (): Damit wird der erste Index eines Zeichens/Strings . Und LstIndexOf: der letzte Index von String/Char zurückgegeben

Von Java Doc: 

  public int indexOf(int ch)
  public int indexOf(String str)

Gibt den Index in dieser Zeichenfolge von erstes Vorkommen des angegebenen Zeichens zurück. 

2
Swagatika

Hier ist ein Code, der einen Teilstring von einer String bis zu einer beliebigen Zeichenliste zurückgibt: 

/**
 * Return a substring of the given original string until the first appearance
 * of any of the given characters.
 * <p>
 * e.g. Original "ab&cd-ef&gh"
 * 1. Separators {'&', '-'}
 * Result: "ab"
 * 2. Separators {'~', '-'}
 * Result: "ab&cd"
 * 3. Separators {'~', '='}
 * Result: "ab&cd-ef&gh"
 *
 * @param original   the original string
 * @param characters the separators until the substring to be considered
 * @return the substring or the original string of no separator exists
 */
public static String substringFirstOf(String original, List<Character> characters) {
    return characters.stream()
            .map(original::indexOf)
            .filter(min -> min > 0)
            .reduce(Integer::min)
            .map(position -> original.substring(0, position))
            .orElse(original);
}
1
m3th0dman

Dies könnte helfen:

public static String getCorporateID(String fileName) {

    String corporateId = null;

    try {
        corporateId = fileName.substring(0, fileName.indexOf("_"));
        // System.out.println(new Date() + ": " + "Corporate:
        // "+corporateId);
        return corporateId;
    } catch (Exception e) {
        corporateId = null;
        e.printStackTrace();
    }

    return corporateId;
}
0
Vinod Moyal