1. 概要

文字列で数字や完全な数字を見つける必要がある場合があります。 これは、正規表現または特定のライブラリ関数の両方で実行できます。

この記事では、正規表現を使用して、文字列内の数値を検索および抽出します。 また、桁を数えるいくつかの方法についても説明します。

2. 数字を数える

文字列内で見つかった桁を数えることから始めましょう。

2.1. 正規表現の使用

Java正規表現を使用して、1桁の一致数カウントできます。

正規表現では、「\d」は「任意の1桁」と一致します。 この式を使用して、文字列の桁を数えましょう。

int countDigits(String stringToSearch) {
    Pattern digitRegex = Pattern.compile("\\d");
    Matcher countEmailMatcher = digitRegex.matcher(stringToSearch);

    int count = 0;
    while (countEmailMatcher.find()) {
        count++;
    }

    return count;
}

正規表現のMatcherを定義したら、それをループで使用して を検索し、すべての一致をカウントできます。 それをテストしてみましょう:

int count = countDigits("64x6xxxxx453xxxxx9xx038x68xxxxxx95786xxx7986");

assertThat(count, equalTo(21));

2.2. Google Guava CharMatcherを使用する

Guava を使用するには、最初にMaven依存関係を追加する必要があります。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

Guavaは、桁をカウントするためのCharMatcher.inRangeメソッドを提供します。

int count = CharMatcher.inRange('0', '9')
  .countIn("64x6xxxxx453xxxxx9xx038x68xxxxxx95786xxx7986");

assertThat(count, equalTo(21));

3. 番号を見つける

数値を数えるには、有効な数式のすべての桁をキャプチャするパターンが必要です。

3.1. 整数の検索

整数を認識する式を作成するには、整数が正または負であり、1つ以上の数字のシーケンスで構成されていることを考慮する必要があります。 また、負の整数の前にはマイナス記号が付いていることにも注意してください。

したがって、正規表現を「-?\ d + 」に拡張することで、整数を見つけることができます。 このパターンは、「オプションのマイナス記号とそれに続く1桁以上の数字」を意味します。

この正規表現を使用して文字列内の整数を検索するサンプルメソッドを作成してみましょう。

List<String> findIntegers(String stringToSearch) {
    Pattern integerPattern = Pattern.compile("-?\\d+");
    Matcher matcher = integerPattern.matcher(stringToSearch);

    List<String> integerList = new ArrayList<>();
    while (matcher.find()) {
        integerList.add(matcher.group());
    }

    return integerList;
}

正規表現にMatcherを作成したら、それをループで使用して、文字列内のすべての整数をfindします。 一致するたびにgroupを呼び出して、すべての整数を取得します。

findIntegers をテストしてみましょう:

List<String> integersFound = 
  findIntegers("646xxxx4-53xxx34xxxxxxxxx-35x45x9xx3868xxxxxx-95786xxx79-86");

assertThat(integersFound)
  .containsExactly("646", "4", "-53", "34", "-35", "45", "9", "3868", "-95786", "79", "-86");

3.2. 10進数を見つける

10進数を検出する正規表現を作成するには、それらを書き込むときに使用される文字のパターンを考慮する必要があります。

10進数が負の場合、マイナス記号で始まります。 この後に、1つ以上の数字とオプションの小数部分が続きます。 この小数部分は小数点で始まり、その後に1桁以上の別のシーケンスが続きます。

これは、正規表現“-?\ d +(\。\ d +)?“を使用して定義できます。

List<String> findDecimalNums(String stringToSearch) {
    Pattern decimalNumPattern = Pattern.compile("-?\\d+(\\.\\d+)?");
    Matcher matcher = decimalNumPattern.matcher(stringToSearch);

    List<String> decimalNumList = new ArrayList<>();
    while (matcher.find()) {
        decimalNumList.add(matcher.group());
    }

    return decimalNumList;
}

次に、findDecimalNumsをテストします。

List<String> decimalNumsFound = 
  findDecimalNums("x7854.455xxxxxxxxxxxx-3x-553.00x53xxxxxxxxxxxxx3456xxxxxxxx3567.4xxxxx");

assertThat(decimalNumsFound)
  .containsExactly("7854.455", "-3", "-553.00", "53", "3456", "3567.4");

4. 見つかった文字列を数値に変換する

また、見つかった数値をJavaタイプに変換したい場合もあります。

ストリームマッピングを使用して、整数をLongに変換してみましょう。

LongStream integerValuesFound = findIntegers("x7854x455xxxxxxxxxxxx-3xxxxxx34x56")
  .stream()
  .mapToLong(Long::valueOf);
        
assertThat(integerValuesFound)
  .containsExactly(7854L, 455L, -3L, 34L, 56L);

次に、同じ方法で10進数をDoubleに変換します。

DoubleStream decimalNumValuesFound = findDecimalNums("x7854.455xxxxxxxxxxxx-3xxxxxx34.56")
  .stream()
  .mapToDouble(Double::valueOf);

assertThat(decimalNumValuesFound)
  .containsExactly(7854.455, -3.0, 34.56);

5. 他の種類の数字を見つける

数値は他の形式で表現できますが、正規表現を調整することで検出できます。

5.1. 科学的記数法

科学的記数法を使用してフォーマットされたいくつかの数値を見つけましょう。

String strToSearch = "xx1.25E-3xxx2e109xxx-70.96E+105xxxx-8.7312E-102xx919.3822e+31xxx";

Matcher matcher = Pattern.compile("-?\\d+(\\.\\d+)?[eE][+-]?\\d+")
  .matcher(strToSearch);

// loop over the matcher

assertThat(sciNotationNums)
  .containsExactly("1.25E-3", "2e109", "-70.96E+105", "-8.7312E-102", "919.3822e+31");

5.2. 16進数

これで、文字列に16進数が含まれます。

String strToSearch = "xaF851Bxxx-3f6Cxx-2Ad9eExx70ae19xxx";

Matcher matcher = Pattern.compile("-?[0-9a-fA-F]+")
  .matcher(strToSearch);

// loop over the matcher

assertThat(hexNums)
  .containsExactly("aF851B", "-3f6C", "-2Ad9eE", "70ae19");

6. 結論

この記事では、最初に、正規表現とGoogleGuavaのCharMatcherクラスを使用して文字列の桁をカウントする方法について説明しました。

次に、正規表現を使用して整数と10進数を見つける方法を検討しました。

最後に、科学的記数法や16進数などの他の形式で数値を見つける方法について説明しました。

いつものように、このチュートリアルのソースコードはGitHubにあります。