Javaの文字列から部分文字列を取得
1. 概要
このチュートリアルでは、JavaのStringから部分文字列を取得する方法を説明します。
主にStringクラスのメソッドを使用し、Apache Commonsの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プロジェクトに次の依存関係を追加する必要があります。
org.apache.commons
commons-lang3
3.8
このライブラリの最新バージョンhereを見つけることができます。
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クラスは、substringメソッドと同様に機能するsubSequenceと呼ばれる別のメソッドを提供します。
唯一の違いは、StringではなくCharSequenceを返し、特定の開始インデックスと終了インデックスでのみ使用できることです。
assertEquals("USA (United States of America)",
text.subSequence(67, text.length() - 1));
5. 正規表現を使用する
正規表現が助けになりますif we have to extract a substring that matches a specific pattern.
例では、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のチュートリアルを参照してください。
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の詳細については、thisのチュートリアルを確認してください。
7. Scannerの使用
通常、Scannerを使用してプリミティブ型を解析し、Stringsを正規表現を使用して解析します。 A Scanner breaks its input into tokens using a delimiter pattern。デフォルトでは空白に一致します。
これを使用して、サンプルテキストから最初の文を取得する方法を見つけましょう。
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操作メソッドを提供します。
この例では、how to extract a substring nested between two Strings:が表示されます
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でのString操作に関するother tutorialsを調べることができます。
いつものように、コードスニペットはover on GitHubで見つけることができます。