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&bookid=123456&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&bookid=123456&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+)だけを抽出できます。
-
Javaで文字列から数値を抽出する方法|replaceAll()メソッドの使い方
java.lang.Stringクラスには、文字列を扱うための便利なメソッドが多数用意されています。これらのメソッドを活用することで、トリム(余分な空白の除去)、連結、変換、比較といったさまざまな文字列操作が可能になります。 文字列から数値だけを取り出したい場合は、StringクラスのreplaceAll()メソッドを使うのが最も手軽です。正規表現「[^0-9]」(0〜9以外のすべての文字に一致)を空文字列に置き換えることで、数字以外の文字を一括して削除できます。 サンプルコード import java.util.Scanner; public class StringExtractTest
-
Pythonで文字列から数値を抽出する方法を徹底解説
```html Pythonでは、文字列に含まれる数値を抽出する方法がいくつかあります。ここでは、代表的な手法である isdigit() メソッドを使った例を中心に、初心者にもわかりやすく解説します。 文字列から1桁ずつ数字を抽出する 文字列内の各文字を順番に調べ、数字だけを出力する最もシンプルな方法です。isdigit() メソッドは、対象の文字が数字であれば True を返します。 >>> str1 = a34e 345 bcd 5he 78 xyz >>> for s in str1: ... if s.isdigit(): ...