В java, как получить подстроку из строки до символа c?

103

У меня есть строка (которая в основном представляет собой имя файла в соответствии с соглашением об именах) abc.def.ghi

Я хотел бы извлечь подстроку перед первой .(т.е. точкой)

В java doc api я не могу найти метод в String, который это делает.
Я что-то упускаю? Как это сделать?

xyz
источник

Ответы:

64

посмотрите на String.indexOfи String.substring.

Убедитесь, что вы проверяете -1 для indexOf.

Тофу пиво
источник
1
коротко и мило. Также помните, что indexOf дает первый индекс подстроки.
Нил Чоудхури
Как сказал @Sam B, вы не объяснили, как его использовать.
IntelliData
113

Принятый ответ правильный, но он не говорит вам, как его использовать. Вот как вы используете функции indexOf и подстроки вместе.

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
}
Сэм Б
источник
1
Это недопустимый код, потому что вы не можете поместить объявление переменной в тело оператора If без фигурных скобок.
Clashsoft
87

Вы можете просто разделить строку ..

public String[] split(String regex)

Обратите внимание, что java.lang.String.split использует значение регулярного выражения разделителя. В основном так ...

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

Конечно, для ясности это разделено на несколько строк. Это можно было бы записать как

String beforeFirstDot = filename.split("\\.")[0];
Чад Шуггинс
источник
5
Ваше предложение неверно, потому что java.lang.String.split принимает значение регулярного выражения как атрибут, а не только строку. Все "." в вашем примере необходимо изменить на "\\." Тогда это сработает :)
Эрик Каджу
2
Я люблю регулярные выражения, но каждый раз меня это беспокоит.
Чад Шуггинс
73

Если ваш проект уже использует commons-lang , StringUtils предоставляет для этой цели хороший метод:

String filename = "abc.def.ghi";

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

см. javadoc [2.6] [3.1]

Макс Фихтельманн
источник
Чище, чем другие решения.
userab
12

или вы можете попробовать что-то вроде

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

Умер Хаят
источник
3
произойдет сбой 'c' отсутствует в строке, поскольку indexOf вернет -1
TofuBeer
@Umer Hayat Что, если имя файла такое def.hij.klm? Как тогда будет работать ваш код? (Ваш код работает только для этого одного примера - вы также можете написать функцию, которая возвращает "abc"- она ​​будет работать точно так же)
Богемский
@Bohemian: Я знаю, что отсутствуют пограничные случаи и проверки. Это был конкретный ответ на конкретный вопрос, и идея заключалась в том, чтобы передать общую идею на примере :).
Умер Хаят
1
@TofuBeer: Хорошо, есть путаница, раньше в посте не было "(то есть точки)". Я думаю и надеюсь, что мой ответ дает общее представление о решении этой проблемы.
Умер Хаят
2
Я бы пошел с: int ix = inString.indexOf ('.'); если (ix> -1) inString = inString.substring (0, ix); Я не знаю, почему Умер предложил вычесть 1. Второй аргумент подстроки - до, но все равно исключает.
Миша Бергер,
4

Как насчет использования регулярного выражения?

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

Это заменяет все от первой точки до конца на "" (т.е. очищает ее, оставляя вам то, что вы хотите)

Вот тест:

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

Вывод:

abc
Богемный
источник
7
Я не голосовал против (и я согласен, что это отстой, когда люди голосуют против без всякой причины), но ваше решение довольно дорогое и не очень очевидно.
TofuBeer
1
@ Knickerless-Noggins Я могу описать это, если вам нужны подробности, я тоже могу это сделать ... но не уверен, как я могу это сделать в комментарии (возможно, придется задать еще один вопрос / ответ). Это дорого, потому что создает целую новую строку вместе со всеми заменяющими символами. substring просто возвращает представление в строку. Это поможет?
TofuBeer
2
@TofuBeer вы не правы. Строки неизменны . Подстрока не возвращает представление. Каждая строка, возвращаемая из метода String, является новой строкой.
Bohemian
@ Knickerless-Noggins Он ошибается ... См. Последние комментарии. Кроме того, это достаточно эффективно. Плотность кода высока - его придется интенсивно использовать, чтобы оправдать добавление большего количества кода ради «производительности».
Bohemian
Очевидно, это изменилось в JDK 7, javarevisited.blogspot.ca/2011/10/…
TofuBeer
2

В java.lang.String вы получаете некоторые методы, такие как indexOf (): который возвращает вам первый индекс символа / строки. и lstIndexOf: который возвращает последний индекс String / char

Из Java Doc:

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

Возвращает индекс в этой строке первого вхождения указанного символа.

Свагатика
источник
2

Вот код, который возвращает подстроку от a Stringдо любого из заданного списка символов:

/**
 * 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
источник
1

Это может помочь:

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;
}
Винод Мойал
источник