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]にあります。