Java正規表現のサブ式(?>re)――バックトラックしない独立パターンの解説
Javaの正規表現におけるサブ式・メタ文字「(?>re)」は、バックトラック(後戻り)を行わない独立したパターンを表します。これは「原子グループ(atomic group)」とも呼ばれ、一度マッチに成功すると、その結果を確定してそれ以降のマッチ処理で再評価されません。
バックトラックとは?
通常、正規表現エンジンはパターン全体がマッチするように、部分的なマッチ結果を巻き戻して別の組み合わせを試す「バックトラック」を行います。しかし「(?>re)」で囲まれた部分は独立して扱われるため、内部でのマッチが確定した後に外側のパターンとの整合性が取れない場合でも、巻き戻しによる再試行が行われません。これにより、意図しないマッチを防いだり、不要なバックトラックによるパフォーマンス低下を回避したりできます。
サンプルコード
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.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");
}
}
}実行結果
Enter a String 9848022338 Match found
コードのポイント
- この例では、パターン「(?>[0-9])」を使って、入力文字列中に1桁の数字(0〜9)が含まれているかどうかを判定しています。
- 入力された「9848022338」には数字が含まれているため、「Match found」と出力されます。
- 単純な1文字のマッチではバックトラックの影響は見えにくいですが、より複雑なパターン(量指定子と組み合わせた場合など)では、(?>...) の有無によってマッチ結果や処理速度が大きく変わることがあります。
なお、Javaでは「(?>re)」のような原子グループのほかに、所有格量指定子(possessive quantifier)である「*+」「++」「?+」なども同様にバックトラックを抑制する目的で利用できます。
-
【Java】正規表現のメタ文字\B(非単語境界)の使い方をサンプルコードで解説
Javaの正規表現におけるメタ文字「\B」は、単語境界以外の位置(非単語境界)にマッチします。この記事では、\Bの基本的な意味と、サンプルコードによる具体的な動作をわかりやすく解説します。 メタ文字\Bとは 正規表現の\bは「単語境界」、すなわち単語文字([a-zA-Z_0-9])とそれ以外の文字の境目にある位置にマッチします。\Bはその逆で、次のような単語境界になっていない位置にマッチします。 単語文字と単語文字の間(例:「ab」の「a」と「b」の間) 非単語文字と非単語文字の間(例:「!@」の「!」と「@」の間) また、\Bはゼロ幅アサーションと呼ばれる種類のパターンのため、マッチし
-
Javaの正規表現で文字列から数値を抽出する方法
Javaの正規表現(Regular Expression)を使えば、文字列の中から数値だけを簡単に取り出すことができます。この記事では、実際のコード例とともに、さまざまなパターンでの数値抽出の方法を解説します。文字列を解析し、必要な情報を抜き出すスキルは、テスターにとって欠かせない能力の一つです。特にAPIテストでは、JSONやXML形式のレスポンスを解析する場面が多く、正規表現の知識が大いに役立ちます。以下では、Javaの正規表現を使って文字列から数字・数値を抽出する具体的な例を紹介します。文字列からすべての数値を抽出するimport java.util.regex.Matcher; imp