Javaの文字列から部分文字列を取得する
1. 概要
このクイックチュートリアルでは、Javaの文字列のサブ文字列機能に焦点を当てます。
主にStringクラスのメソッドを使用し、ApacheCommonsのStringUtilsクラスのメソッドをいくつか使用します。
次のすべての例では、この単純な文字列を使用します。
String text = "Julia Evans was born on 25-09-1984. "
+ "She is currently living in the USA (United States of America).";
2. サブストリングの基本
ここで非常に簡単な例から始めましょう–開始インデックスで部分文字列を抽出します:
assertEquals("USA (United States of America).",
text.substring(67));
ここの例では、ジュリアの居住国をどのように抽出したかに注意してください。
終了インデックスを指定するオプションもあります 、しかしそれなし– 部分文字列の終わりまでずっと行きます
上記の例では、それを実行して、最後にある余分なドットを取り除きましょう。
assertEquals("USA (United States of America)",
text.substring(67, text.length() - 1));
上記の例では、正確な位置を使用して部分文字列を抽出しました。
2.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));
3. subSequenceを使用する
String クラスは、 subSequence と呼ばれる別のメソッドを提供します。これは、substringメソッドと同様に機能します。
唯一の違いは、Stringの代わりにCharSequenceを返し、特定の開始インデックスと終了インデックスでのみ使用できることです。
assertEquals("USA (United States of America)",
text.subSequence(67, text.length() - 1));
4. 正規表現の使用
特定のパターンに一致する部分文字列を抽出する必要がある場合は、正規表現が役に立ちます。
String、の例では、ジュリアの生年月日は「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正規表現の詳細については、thisチュートリアルをご覧ください。
5. splitを使用する
Stringクラスのsplitメソッドを使用して、サブストリングを抽出できます。 例String。から最初の文を抽出するとします。これは、splitを使用して非常に簡単に実行できます。
String[] sentences = text.split("\\.");
splitメソッドは正規表現を受け入れるため、ピリオド文字をエスケープする必要がありました。 これで、結果は2つの文の配列になります。
最初の文を使用できます(または配列全体を反復処理します)。
assertEquals("Julia Evans was born on 25-09-1984", sentences[0]);
ApacheOpenNLPを使用した文の検出とトークン化にはより良い方法があることに注意してください。 OpenNLP APIの詳細については、thisチュートリアルをご覧ください。
6. スキャナーを使用する
通常、 Scanner を使用してプリミティブ型を解析し、Stringsを正規表現を使用して解析します。 スキャナーは、デフォルトで空白と一致する区切り文字パターンを使用して、入力をトークンに分割します。
これを使用して、サンプルテキストから最初の文を取得する方法を見つけましょう。
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()
}
7. Mavenの依存関係
もう少し進んで、便利なユーティリティ– StringUtils クラス– Apache CommonsLangライブラリの一部を使用できます。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
このライブラリの最新バージョンはここにあります。
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 CommonsLangAPIを使用したString処理の詳細を確認できます。
9. 結論
この簡単な記事では、JavaのStringからサブストリングを抽出するさまざまな方法を見つけました。 Javaでの文字列操作に関するその他のチュートリアルを調べることができます。
いつものように、コードスニペットはGitHubのにあります。