Javaで文字cから文字cまでの部分文字列を取得する方法は?


100

文字列があります(これは基本的に、命名規則に従ったファイル名です) abc.def.ghi

最初の前の部分文字列を抽出したい.(つまり、ドット)

java doc apiでは、それを行うString内のメソッドを見つけることができないようです。
何か不足していますか?どうやってするの?

回答:


65

見てString.indexOfString.substring

の-1を確認してくださいindexOf


1
短くて甘い。また、indexOfは部分文字列の最初のインデックスを与えることも覚えておいてください。
Neil Chowdhury 2017

111

受け入れられた答えは正しいですが、それを使用する方法を教えてくれません。これは、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 2018

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は、文字列だけでなく、正規表現の値を属性として受け取るため、提案は正しくありません。すべて "。" あなたの例では「\\」に変更する必要があります。その後、動作します:)
Erik Kaju

2
私は正規表現が大好きですが、それは毎回私を魅了します。
チャドショギンズ2013年


12

またはあなたは次のようなことを試すかもしれません

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


3
indexOfが-1を返すため、「c」のクラッシュは文字列に含まれません
TofuBeer

@Umer Hayatファイル名が次の場合はどうなりますdef.hij.klmか?次に、コードはどのように機能しますか?(コードはこの1つの例でのみ機能します"abc"- 戻り値を返す関数を作成することもできます- 同様に機能します)
ボヘミアン

@Bohemian:境界ケースとチェックがないことを知っています。それは特定の質問に対する具体的な回答であり、アイデアは例を通して一般的なアイデアを与えることでした:)
Umer Hayat、2011年

1
@TofuBeer:わかりました、以前の混乱はありました(つまり、ドット)は実際の投稿にはありませんでした。私は、私の答えがこの種の問題を解決するための一般的な考えを与えると思い、願っています。
Umer Hayat、2011年

2
私は行くでしょう:int ix = inString.indexOf( '。'); if(ix> -1)inString = inString.substring(0、ix); Umerが減算1を提案した理由がわかりません。substringの2番目の引数は、とにかく除外されています。
Micha Berger 14

4

正規表現を使用するのはどうですか?

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

これは最初のドットから最後まですべてを ""で置き換えます(つまり、それをクリアし、必要なものを残します)

ここにテストがあります:

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

出力:

abc

7
私は反対票を投じませんでした(そして、人々が理由もなく反対票を投じるのは悪いことだと私は同意します)が、あなたの解決策はかなり高価であり、それほど明白ではありません。
TofuBeer 2011年

1
@ Knickerless-Noggins私はそれを説明できます。詳細が必要な場合は、私もそれを行うことができます...しかし、コメントでそれを行う方法がわからない(おそらく別の質問/回答を行う必要がある)。文字を置き換えるすべての文字列とともにまったく新しい文字列を作成するため、コストがかかります。substringは単にビューを文字列に返します。助けて?
豆腐ビール

2
@TofuBeer不正解です。文字列は不変です。サブストリングはビューを返しませ。Stringメソッドから返されるすべてのStringは新しい Stringです。
ボヘミアン

@ Knickerless-Noggins彼は間違っています...最近のコメントを参照してください。また、それで十分です。コード密度は高いです-「パフォーマンス」のためにコードを追加することを正当化するために激しく使用する必要があります。
ボヘミアン

JDK 7で明らかに変更されたようです、javarevisited.blogspot.ca
2011/10 /

2

java.lang.Stringでは、char / 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);
}

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.