Javaで文字列から部分文字列を取得する

1概要

このチュートリアルでは、Javaで String から部分文字列を取得する方法について説明します。

主にhttps://docs.oracle.com/javase/8/docs/api/java/lang/String.html[ String ]クラスのメソッドを使用し、Apache Commonsのhttps://commonsからはほとんど使用しません。 apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html[ StringUtils ]クラス。

私たちが取り組むすべての例では、

String text = "Julia Evans was born on 25-09-1984. "
  + "She is currently living in the USA (United States of America).";

2 Mavenの依存関係

Apache Commons Lang ライブラリの一部である StringUtils クラスを使用するには、Mavenプロジェクトに次の依存関係を追加する必要があります。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8</version>
</dependency>

あなたはこのライブラリの最新版を見つけることができます。 22[ここ]

3 substring を使う

これは部分文字列を抽出するために最も頻繁に使用される方法です。開始インデックスとオプションの終了インデックスを指定して、その間の文字を抽出できます。

  • 終了インデックスを指定しないと、部分文字列は__Stringの最後まで続きます。

ジュリアの居住国を抽出したいとします。

assertEquals("USA (United States of America).",
  text.substring(67));

出力の最後のピリオドを取り除くには、同じ方法を少し修正したものを使います。

assertEquals("USA (United States of America)",
  text.substring(67, text.length() - 1));

上記の例では、サブストリングを抽出するために正確な位置を使用しました。

3.1. 特定の文字から始まる部分文字列を取得する

  • 位置を文字または String に基づいて動的に計算する必要がある場合は、 indexOf メソッドを使用できます。

assertEquals("United States of America",
  text.substring(text.indexOf('(') + 1, text.indexOf(')')));

私たちが部分文字列を見つけるのを助けることができる同様の方法は lastIndexOf です。

lastIndexOf を使用して年「1984」を抽出しましょう。最後のダッシュと最初のドットの間のテキストの部分です。

assertEquals("1984",
  text.substring(text.lastIndexOf('-') + 1, text.indexOf('.')));

indexOf lastIndexOf はどちらも文字として、または String をパラメータとして使用できます。テキスト「USA」と残りのテキストを括弧内で抽出しましょう。

assertEquals("USA (United States of America)",
  text.substring(text.indexOf("USA"), text.indexOf(')') + 1));

4 subSequence を使用する

String クラスは subSequence という別のメソッドを提供します。

  • 唯一の違いは、 String の代わりにhttps://docs.oracle.com/javase/8/docs/api/java/lang/CharSequence.html[ CharSequence ]を返すことと、特定のアプリケーションでのみ使用できることです開始インデックスと終了インデックス:**

assertEquals("USA (United States of America)",
  text.subSequence(67, text.length() - 1));

5正規表現を使う

特定のパターンに一致する部分文字列を抽出する必要がある場合は、正規表現が役立ちます。

Stringの例では、 Juliaの生年月日は“ dd-mm-yyyy”の形式です。 Javaの正規表現APIを使用してこのパターンを一致させることができます。

まず、「dd-mm-yyyy」のパターンを作成する必要があります。

Pattern pattern = Pattern.compile("\\d{2}-\\d{2}-\\d{4}");

それから、与えられたテキストからマッチを見つけるためにパターンを適用します:

Matcher matcher = pattern.matcher(text);

一致したら、一致した__Stringを抽出します。

if (matcher.find()) {
    Assert.assertEquals("25-09-1984", matcher.group());
}

Java正規表現の詳細については、https://www.baeldung.com/regular-expressions-java[この]チュートリアルを参照してください。

6. split を使う

String クラスの split メソッドを使って部分文字列を抽出することができます。 String. の例から最初の文を抽出したいとします。これは split を使用して行うのが非常に簡単です。

String[]sentences = text.split("\\.");

splitメソッドは正規表現を受け入れるので、ピリオド文字をエスケープする必要がありました。結果は2文の配列になります。

最初の文を使うことができます(または配列全体を反復処理します)。

assertEquals("Julia Evans was born on 25-09-1984", sentences[0]);

Apache OpenNLPを使った文の検出とトークン化のためのより良い方法があることに注意してください。 OpenNLP APIの詳細については、https://www.baeldung.com/apache-open-nlp[この]チュートリアルをご覧ください。

7. Scanner を使用する

通常、https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html[ Scanner ]を使用して、プリミティブ型と Strings を正規表現で解析します。 Scanner は、区切り文字パターン を使用して入力をトークンに分割します。** はデフォルトで空白文字と一致します。

例のテキストから最初の文を取得するためにこれを使用する方法を見つけましょう。

try (Scanner scanner = new Scanner(text)) {
    scanner.useDelimiter("\\.");
    assertEquals("Julia Evans was born on 25-09-1984", scanner.next());
}

上記の例では、スキャナが使用するソースとして String という例を設定しました。

次に、ピリオド文字を区切り文字として設定します(それ以外の場合はエスケープする必要があります)。

最後に、この区切られた出力から最初のトークンを表明します。

必要に応じて、 while ループを使用してトークンの完全なコレクションを反復処理できます。

while (scanner.hasNext()) {
  //do something with the tokens returned by scanner.next()
}

8 StringUtils を使用する

Apache Commonsライブラリには、コアJava型を操作するための便利なメソッドがいくつか追加されています。 Apache Commons Langはjava.lang APIのためのたくさんのヘルパーユーティリティ、とりわけ String 操作メソッドを提供します。

この例では、2つの__文字列の間にネストされている部分文字列を抽出する方法を説明します。

assertEquals("United States of America",
  StringUtils.substringBetween(text, "(", ")"));

サブストリングが同じ__Stringの2つのインスタンスの間にネストされている場合に備えて、このメソッドを単純化したものがあります。

substringBetween(String str, String tag)

同じクラスの substringAfter メソッドは、最初にセパレータが出現した後の部分文字列を取得します。

セパレータは返されません。

assertEquals("the USA (United States of America).",
  StringUtils.substringAfter(text, "living in "));

同様に、 substringBefore メソッドは、区切り文字が最初に現れる前の部分文字列を取得します。

セパレータは返されません。

assertEquals("Julia Evans",
  StringUtils.substringBefore(text, " was born"));

このチュートリアルを調べて、Apache Commons Lang APIを使った String 処理の詳細を調べてください。

9結論

このクイック記事では、Javaで String から部分文字列を抽出するさまざまな方法を見つけました。 Javaでの文字列操作に関するhttps://www.baeldung.com/java-string[その他のチュートリアル]を調べることができます。

いつものように、コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/java-strings[over on GitHub]にあります。