Java正規表現のサブ表現(?:re)とは?非キャプチャグループの基本とサンプルコード
Javaの正規表現におけるサブ表現(メタ文字)「(?: re)」は、正規表現をグループ化するための構文です。通常のグループ「(re)」と異なり、マッチしたテキストを記憶(キャプチャ)しないため、「非キャプチャグループ」と呼ばれます。
(?:re) の特徴
「(?:re)」を使うと、複数の要素をひとつのまとまりとして扱えますが、後方参照や group() メソッドでの取得対象にはなりません。マッチの判定だけが必要で、キャプチャした文字列を後から利用しない場合に、メモリの無駄を省き、パターンをすっきり記述できるのがメリットです。
サンプルコード
以下は、ユーザーから入力された文字列に対して「(?:[0-9])」というパターンでマッチするかどうかを確認するJavaプログラムの例です。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternExample {
public static void main(String args[]) {
// ユーザーから文字列を読み込む
System.out.println("Enter a String");
Scanner sc = new Scanner(System.in);
String input = sc.next();
// 非キャプチャグループを使用した正規表現
String regex = "(?:[0-9])";
// 正規表現をコンパイルしてPatternオブジェクトを生成
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトを取得
Matcher matcher = pattern.matcher(input);
// マッチが存在するかどうかを検証
boolean bool = matcher.find();
if(bool) {
System.out.print("Match found");
} else {
System.out.print("Match not found");
}
}
}
実行結果
数字を含む文字列「9848022338」を入力すると、パターン「(?:[0-9])」(0〜9のいずれか1文字)と一致するため、「Match found」が出力されます。
Enter a String 9848022338 Match found
キャプチャグループ (re) との違い
「([0-9])」のように通常の括弧を使った場合はマッチした部分が記憶され、matcher.group(1) などで取り出せます。一方「(?:[0-9])」ではグループ化のみ行われ、記憶はされません。単純にマッチの有無を確認したい場合や、グループ番号をずらしたくない場合には、非キャプチャグループ「(?:re)」の使用が推奨されます。
-
Javaで正規表現を使って文字列の先頭ゼロを削除する方法
JavaのStringクラスが提供するreplaceAll()メソッドは、「正規表現パターン」と「置換後の文字列」の2つの引数を受け取り、パターンにマッチした部分をすべて指定した文字列に置き換えます。 文字列の先頭にあるゼロ(先行ゼロ)にマッチさせるための正規表現は、次のとおりです。 ^0+(?!$) このパターンの意味は以下のとおりです。 ^0+:文字列の先頭から始まる1個以上の「0」にマッチします。 (?!$):否定先読みと呼ばれる構文で、文字列の末尾ではない位置であることを保証します。これにより、「0000」のようにすべてがゼロの文字列の場合でも、最後の1個のゼロが残り、空文字列にな
-
Javaの正規表現で文字列から数値を抽出する方法
Javaの正規表現(Regular Expression)を使えば、文字列の中から数値だけを簡単に取り出すことができます。この記事では、実際のコード例とともに、さまざまなパターンでの数値抽出の方法を解説します。文字列を解析し、必要な情報を抜き出すスキルは、テスターにとって欠かせない能力の一つです。特にAPIテストでは、JSONやXML形式のレスポンスを解析する場面が多く、正規表現の知識が大いに役立ちます。以下では、Javaの正規表現を使って文字列から数字・数値を抽出する具体的な例を紹介します。文字列からすべての数値を抽出するimport java.util.regex.Matcher; imp