Java正規表現の文字クラスで範囲を減算(差集合)する方法
Javaの正規表現では、ある文字の範囲から別の範囲を引き算して、新しい範囲として扱うことができます。これを実現するには、文字クラスの2つの機能、すなわち否定(negation)と共通部分(intersection)を組み合わせて使用します。
例えば、範囲 [a-l] と [^e-h] の共通部分を取ると、「a〜l のうち e〜h を除いた文字」、つまり a・b・c・d・i・j・k・l が得られます。これが文字クラスにおける「減算」の仕組みです。
構文のポイント
減算を行う場合は、文字クラス内で && 演算子を使って2つの条件を結合します。
[a-l&&[^e-h]]
[a-l]… アルファベット a から l までの範囲[^e-h]… e から h までの文字を除外(否定)
サンプルコード
以下は、ユーザーが入力したテキストから「a〜l の範囲に含まれ、かつ e〜h 以外」の文字をすべて検出し、その個数を表示するプログラムです。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String regex = "[a-l&&[^e-h]]";
// パターンオブジェクトを作成
Pattern pattern = Pattern.compile(regex);
// コンパイルしたパターンを文字列に対してマッチング
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
System.out.print(matcher.group() + " ");
}
System.out.println("Number of matched characters: " + count);
}
}実行結果
Enter input text: abcdefghijklmnopq a b c d i j k l Number of matched characters: 8
解説
入力文字列 abcdefghijklmnopq に対してパターン [a-l&&[^e-h]] を適用すると、a〜l の範囲内にある文字のうち、e・f・g・h が除外されるため、a b c d i j k l の8文字がマッチします。m 以降の文字は範囲 [a-l] 外であるため対象外となります。
このように否定と共通部分を組み合わせることで、柔軟に文字セットを定義でき、特定の文字だけを除外したマッチング処理が簡単に実装できます。
-
Javaの正規表現におけるサブ式(グループ化)の使い方
Javaの正規表現において、サブ式(メタ文字)( )は、複数の正規表現をひとつのグループにまとめ、マッチしたテキストを記憶する働きを持ちます。グループ化を活用すると、選択(|)の適用範囲を限定したり、マッチした一部分の文字列を後から取り出したりできるようになります。 例1:基本的なグループ化 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Example { public static void main(String args[]) { String input =
-
Javaの正規表現で文字列から数値を抽出する方法
Javaの正規表現(Regular Expression)を使えば、文字列の中から数値だけを簡単に取り出すことができます。この記事では、実際のコード例とともに、さまざまなパターンでの数値抽出の方法を解説します。文字列を解析し、必要な情報を抜き出すスキルは、テスターにとって欠かせない能力の一つです。特にAPIテストでは、JSONやXML形式のレスポンスを解析する場面が多く、正規表現の知識が大いに役立ちます。以下では、Javaの正規表現を使って文字列から数字・数値を抽出する具体的な例を紹介します。文字列からすべての数値を抽出するimport java.util.regex.Matcher; imp