Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの正規表現で文字列から数値を抽出する方法

Javaの正規表現(Regular Expression)を使えば、文字列の中から数値だけを簡単に取り出すことができます。この記事では、実際のコード例とともに、さまざまなパターンでの数値抽出の方法を解説します。

文字列を解析し、必要な情報を抜き出すスキルは、テスターにとって欠かせない能力の一つです。特にAPIテストでは、JSONやXML形式のレスポンスを解析する場面が多く、正規表現の知識が大いに役立ちます。

以下では、Javaの正規表現を使って文字列から数字・数値を抽出する具体的な例を紹介します。

文字列からすべての数値を抽出する

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExamples {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("string1234more567string890");
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

実行結果:

1234
567
890

\d+ は「1桁以上の連続した数字」にマッチするパターンです。find() メソッドを while ループで回すことで、文字列内に含まれるすべての数値を順番に取得できます。

  • JavaでStringをintに変換する方法
  • Javaで文字列を逆順にする方法
  • Javaで文字列を比較する方法

文字列からn番目の数字を抽出する

文字列の中から特定の数値だけを取り出したい場合は、group() メソッドにインデックスを指定します。

例えば、string1234more567string890 という文字列から、2番目の数字グループである 567 だけを抽出したい場合は、次のように記述します。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExamples {
    private static final Pattern p = Pattern.compile("[^\\d]*[\\d]+[^\\d]+([\\d]+)");

    public static void main(String[] args) {
        // パターンpと対象文字列からマッチャーを作成
        Matcher m = p.matcher("string1234more567string890");

        // マッチが見つかった場合...
        if (m.find()) {
            System.out.println(m.group(1)); // 2番目にマッチした数字を出力
        }
    }
}

実行結果:

567

パターン [^\d]*[\d]+[^\d]+([\d]+) の意味は以下の通りです。

  • 数字以外の任意の文字を無視する
  • 1番目の数字を無視する
  • 再び数字以外の文字を無視する
  • 2番目の数字をキャプチャする

タグの属性から数値を抽出する

XMLやHTMLのタグを扱う際、属性の値を抽出したいケースがあります。例えば、次のようなタグがあったとしましょう。

<result name="response" numFound="9999" start="0">

この中から 9999 という数値を抽出するには、以下のコードを使用します。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExamples {
    public static void main(String[] args) {
        String xml = "<result name=\"response\" numFound=\"9999\" start=\"0\">";
        Pattern pattern = Pattern.compile("numFound=\"([0-9]+)\"");
        Matcher matcher = pattern.matcher(xml);

        if (matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }
}

実行結果:

9999

numFound="([0-9]+)" というパターンは、numFound=" に続く1桁以上の数字をキャプチャグループとして捕らえます。group(1) を呼び出すことで、その値を取得できます。

数字と英字を含む文字列を抽出する

Javaの正規表現を使えば、数字と英字が混在した部分文字列を抽出することも可能です。例えば、Sample_data = YOUR SET ADDRESS IS 6B1BC0 TEXT という文字列から、6文字6B1BC0 を取り出したい場合は、次のようにします。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExamples {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("YOUR SET ADDRESS IS\\s+([A-Z0-9]{6})");
        Matcher n = p.matcher("YOUR SET ADDRESS IS 6B1BC0 TEXT");
        if (n.find()) {
            System.out.println(n.group(1)); // 6B1BC0 を出力
        }
    }
}

実行結果:

6B1BC0

パターン末尾の [A-Z0-9]{6} は「半角英大文字または数字がちょうど6文字続く部分」を意味し、目的の値だけを正確にキャプチャできます。

正規表現でキーと値のペアを抽出する

bookname=testing&amp;bookid=123456&amp;bookprice=123.45 のようなクエリ文字列形式のデータから、bookid=123456 の値だけを抽出したい場合は、後読みアサーション(lookbehind)を使うと便利です。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExamples {
    public static void main(String[] args) {
        String s = "bookname=cooking&amp;bookid=123456&amp;bookprice=123.45";
        Pattern p = Pattern.compile("(?<=bookid=)\\d+");
        Matcher m = p.matcher(s);
        if (m.find()) {
            System.out.println(m.group());
        }
    }
}

実行結果:

123456

(?<=bookid=) は「直前が bookid= である位置」を表す後読みアサーションです。これにより bookid= 自体をマッチ結果に含めることなく、値となる数字列(\d+)だけを抽出できます。

  1. Javaで文字列から数値を抽出する方法|replaceAll()メソッドの使い方

    java.lang.Stringクラスには、文字列を扱うための便利なメソッドが多数用意されています。これらのメソッドを活用することで、トリム(余分な空白の除去)、連結、変換、比較といったさまざまな文字列操作が可能になります。 文字列から数値だけを取り出したい場合は、StringクラスのreplaceAll()メソッドを使うのが最も手軽です。正規表現「[^0-9]」(0〜9以外のすべての文字に一致)を空文字列に置き換えることで、数字以外の文字を一括して削除できます。 サンプルコード import java.util.Scanner; public class StringExtractTest

  2. Pythonで文字列から数値を抽出する方法を徹底解説

    ```html Pythonでは、文字列に含まれる数値を抽出する方法がいくつかあります。ここでは、代表的な手法である isdigit() メソッドを使った例を中心に、初心者にもわかりやすく解説します。 文字列から1桁ずつ数字を抽出する 文字列内の各文字を順番に調べ、数字だけを出力する最もシンプルな方法です。isdigit() メソッドは、対象の文字が数字であれば True を返します。 >>> str1 = a34e 345 bcd 5he 78 xyz >>> for s in str1: ... if s.isdigit(): ...