在java中如何从字符串中获取子字符串直到字符c?


101

我有一个字符串(基本上是遵循命名约定的文件名) abc.def.ghi

我想在第一个.(即一个点)之前提取子字符串

在java doc api中,我似乎找不到在String中执行此操作的方法。
我想念什么吗?怎么做?

Answers:


65

String.indexOfString.substring

确保检查的-1 indexOf


1
简短而甜美。还请记住indexOf给出了子字符串的第一个索引。
尼尔·乔杜里

112

接受的答案是正确的,但没有告诉您如何使用它。这是一起使用indexOf和substring函数的方式。

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

84

您可以只拆分字符串。

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将regex值作为属性,而不仅仅是字符串。全部为“。” 您的示例中需要更改为“ \\”。然后它将起作用:)
Erik Kaju 2012年

2
我喜欢正则表达式,但是每次都能得到我。
乍得·肖金斯


12

或者您可以尝试类似

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


3
将崩溃'c'不在字符串中,因为indexOf将返回-1
TofuBeer

@Umer Hayat如果文件名是def.hij.klm什么?那么您的代码将如何工作?(您的代码仅适用于该示例-您最好编写一个返回的函数"abc"-它也将同样有效)
Bohemian

@波西米亚人:我知道有边界案件和检查遗失。这是对特定问题的具体答案,想法是通过示例给出总体想法:)。
Umer Hayat '10

1
@TofuBeer:好的,以前的帖子中并没有出现“(例如一个圆点)”的混乱情况。我认为并希望我的回答给出解决此类问题的总体思路。
Umer Hayat '10

2
我会去:int ix = inString.indexOf('。'); 如果(ix> -1)inString = inString.substring(0,ix); 我不知道为什么Umer建议减去1。substring的第二个参数最多是但不包括在内。
Micha Berger 2014年

4

如何使用正则表达式?

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

这会将所有从第一个点到最后一个点的内容都替换为“”(即清除它,使您拥有所需的内容)

这是一个测试:

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

输出:

abc

7
我没有投票,(我同意人们无缘无故投票时很烂),但是您的解决方案非常昂贵,而且不是很明显。
TofuBeer 2011年

1
@ Knickerless-Noggins我可以形容一下,如果您想具体一点,我也可以这样做...但是不确定我如何在评论中做到(也许必须做另一个问题/回答)。这很昂贵,因为它会创建一个全新的字符串以及所有替换字符。substring只是返回对该字符串的视图。这种帮助?
TofuBeer

2
@TofuBeer您不正确。字符串是不可变的。串并没有返回一个视图。从String方法返回的每个String都是一个新的 String。
波希米亚

@ Knickerless-Noggins他弄错了...查看最新评论。而且,它足够有效。代码密度很高-为了“性能”,必须大量使用它来证明添加更多代码是合理的。
波希米亚

在JDK 7中,它显然已更改,javarevisited.blogspot.ca
2011/

2

在java.lang.String中,您将获得一些类似于indexOf()的方法:该方法将返回字符/字符串的第一个索引。和lstIndexOf:返回字符串/字符的最后一个索引

从Java Doc:

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

返回指定字符首次出现在此字符串中的索引。


2

以下是返回从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);
}

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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.