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

100

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

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

In Java Doc API kann ich anscheinend keine Methode in String finden, die das tut.
Vermisse ich etwas Wie es geht?

xyz
quelle

Antworten:

65

schau dir an String.indexOfund String.substring.

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

TofuBeer
quelle
1
kurz und bündig. Denken Sie auch daran, dass indexOf den ersten Index der Teilzeichenfolge angibt.
Neil Chowdhury
111

Die akzeptierte Antwort ist korrekt, sagt Ihnen jedoch nicht, wie Sie sie verwenden sollen. Auf diese Weise 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
}
Sam B.
quelle
1
Dies ist ein ungültiger Code, da Sie keine Variablendeklaration ohne geschweifte Klammern in den Text einer If-Anweisung einfügen können.
Clashsoft
84

Sie können die Zeichenfolge einfach teilen .

public String[] split(String regex)

Beachten Sie, dass java.lang.String.split den regulären Ausdruckswert des Trennzeichens verwendet. Grundsätzlich so ...

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 Helligkeit in mehrere Zeilen unterteilt. Es könnte geschrieben werden als

String beforeFirstDot = filename.split("\\.")[0];
Chad Schouggins
quelle
5
Ihr Vorschlag ist nicht korrekt, da java.lang.String.split den Regex-Wert als Attribut verwendet und nicht nur die Zeichenfolge. Alles "." in Ihrem Beispiel muss in "\\" geändert werden. Dann wird es funktionieren :)
Erik Kaju
2
Ich liebe Regex, aber das bringt mich jedes Mal.
Chad Schouggins
70

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

String filename = "abc.def.ghi";

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

siehe javadoc [2.6] [3.1]

Max Fichtelmann
quelle
Sauberer als andere Lösungen.
Userab
12

oder Sie können so etwas versuchen

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

Umer Hayat
quelle
3
wird abstürzen von 'c' ist nicht in der Zeichenfolge, da indexOf -1
TofuBeer
@Umer Hayat Was ist, wenn der Dateiname ist def.hij.klm? Wie würde Ihr Code dann funktionieren? (Ihr Code funktioniert nur für dieses eine Beispiel - Sie könnten genauso gut eine Funktion schreiben, die zurückgibt "abc"- es würde genauso gut funktionieren )
Bohemian
@Bohemian: Ich weiß, dass Grenzfälle und Schecks fehlen. Es war eine spezifische Antwort auf die spezifische Frage und die Idee war, die allgemeine Idee durch ein Beispiel zu geben :).
Umer Hayat
1
@TofuBeer: Ok, gut, es gibt eine Verwirrung früher "(dh ein Punkt)" war nicht in der tatsächlichen Post. Ich denke und hoffe, dass meine Antwort eine allgemeine Idee gibt, um diese Art von Problem zu lösen.
Umer Hayat
2
Ich würde gehen mit: int ix = inString.indexOf ('.'); if (ix> -1) inString = inString.substring (0, ix); Ich weiß nicht, warum Umer vorgeschlagen hat, 1 zu subtrahieren. Das zweite Argument der Teilzeichenfolge liegt bei, schließt es aber trotzdem aus.
Micha Berger
4

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 dem, was Sie wollen)

Hier ist ein Test:

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

Ausgabe:

abc
Böhmisch
quelle
7
Ich habe nicht abgelehnt (und ich bin damit einverstanden, dass es scheiße ist, wenn Leute ohne Grund abstimmen), aber Ihre Lösung ist ziemlich teuer und nicht sehr offensichtlich.
TofuBeer
1
@ Knickerless-Noggins Ich kann es beschreiben, wenn du Einzelheiten willst, kann ich das auch ... aber nicht sicher, wie ich es in einem Kommentar machen könnte (muss vielleicht eine andere Frage / Antwort machen). Es ist teuer, weil es eine ganz neue Zeichenfolge erstellt und alle Zeichen ersetzt. Teilzeichenfolge gibt einfach eine Ansicht in die Zeichenfolge zurück. Diese Hilfe?
TofuBeer
2
@TofuBeer du bist falsch. Saiten sind unveränderlich . Teilzeichenfolge gibt keine Ansicht zurück. Jeder von einer String-Methode zurückgegebene String ist ein neuer String.
Böhmisch
@ Knickerless-Noggins Er irrt sich ... Siehe aktuelle Kommentare. Auch ist es efficeiemt genug. Die Codedichte ist hoch - sie müsste intensiv genutzt werden, um das Hinzufügen von mehr Code aus Gründen der "Leistung" zu rechtfertigen.
Böhmisch
Es hat sich anscheinend in JDK 7 geändert, javarevisited.blogspot.ca/2011/10/…
TofuBeer
2

In java.lang.String erhalten Sie einige Methoden wie indexOf (): Gibt den ersten Index eines Zeichens / Strings zurück. und lstIndexOf: Gibt den letzten Index von String / char zurück

Aus Java Doc:

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

Gibt den Index innerhalb dieser Zeichenfolge des ersten Vorkommens des angegebenen Zeichens zurück.

Swagatika
quelle
2

Hier ist Code, der eine Teilzeichenfolge von a Stringbis zu einer bestimmten 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);
}
m3th0dman
quelle
1

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;
}
Vinod Moyal
quelle