【Java】10文字以上・偶数長の16進数にマッチする正規表現の書き方
以下は、長さが偶数で10文字以上となる16進数にマッチする正規表現です。
^(?=.{10,255}$)(?:0x)?\p{XDigit}{2}(?:\p{XDigit}{2})*$
正規表現を構成する各要素の意味は次のとおりです。
^ − 文字列の先頭にマッチします。
(?=.{10,255}$) − 先読み(lookahead)により、文字列全体の長さが10〜255文字であることを確認します。
(?:0x)? − 先頭に付けられる接頭辞「0x」にマッチします。あってもなくても構いません。
\p{XDigit}{2} − 16進数の文字2つにマッチします。
(?:\p{XDigit}{2})* − 「16進数の文字2つ」の組が0回以上繰り返される部分にマッチします。この構造により、文字列全体の長さが必ず偶数になります。
$ − 文字列の末尾にマッチします。
正規表現のポイント
このパターンでは、まず先読み (?=.{10,255}$) によって文字列の長さが10〜255文字の範囲内かどうかを検証し、続く \p{XDigit}{2}(?:\p{XDigit}{2})* によって16進数の文字が2文字ずつのペアで並んでいることを確認します。そのため、9文字以下の短い文字列、奇数長の文字列、16進数(0〜9、a〜f、A〜F)以外の文字を含む文字列は、いずれもマッチから除外されます。
例1:複数の入力値をまとめて検証する
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaExample51 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String nums[] = new String[5];
for(int i=0; i<nums.length; i++){
System.out.println("16進数を入力してください:");
nums[i] = sc.nextLine();
}
// 偶数長かつ10文字以上の16進数を受け付ける正規表現
String regex = "^(?=.{10,255}$)(?:0x)?\\p{XDigit}{2}(?:\\p{XDigit}{2})*$";
// Patternオブジェクトを作成
Pattern pattern = Pattern.compile(regex);
for (String hex : nums) {
// Matcherオブジェクトを作成
Matcher matcher = pattern.matcher(hex);
if(matcher.find()) {
System.out.println(hex + " は有効です");
} else {
System.out.println(hex + " は無効です");
}
}
}
}
出力
16進数を入力してください: 0x1234567890 16進数を入力してください: 123456789 16進数を入力してください: 123456789012 16進数を入力してください: sfdgdf35364 16進数を入力してください: $@%#BV#* 0x1234567890 は有効です 123456789 は無効です 123456789012 は有効です sfdgdf35364 は無効です $@%#BV#* は無効です
この結果から、「0x1234567890」(全体で12文字)や「123456789012」(12文字)のように、長さが10文字以上の偶数で、すべての文字が16進数で構成されている入力のみが有効と判定されていることがわかります。「123456789」は9文字と短いため無効となり、「sfdgdf35364」や「$@%#BV#*」は16進数以外の文字を含むため無効と判定されます。
例2:matches() メソッドを使った検証
次の例では、Pattern クラスを使わず、String クラスの matches() メソッドだけで同じ正規表現による検証を行っています。
import java.util.Scanner;
public class JavaExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("16進数を入力してください:");
String name = sc.nextLine();
String regex = "^(?=.{10,255}$)(?:0x)?\\p{XDigit}{2}(?:\\p{XDigit}{2})*$";
boolean result = name.matches(regex);
if(result) {
System.out.println("入力された値は有効です");
} else {
System.out.println("入力された値は無効です");
}
}
}
出力1
16進数を入力してください: 0x1234567890 入力された値は有効です
出力2
16進数を入力してください: 024587545 入力された値は無効です
出力2の「024587545」は9文字のため、長さが10文字以上という条件を満たしておらず、無効と判定されます。
-
【Java】BigIntegerクラスで素数を判定し、次の素数を見つける方法
Javaで大きな整数を扱う際に便利なのが、java.math.BigIntegerクラスです。このクラスは、Javaのプリミティブ整数型のすべての演算子に相当する操作や、java.lang.Mathクラスの関連メソッドを提供しています。さらに、ある数が素数かどうかを判定するメソッドや、次の素数(確率的素数)を見つけるメソッドも用意されています。 isProbablePrime()メソッドで素数を判定する isProbablePrime()は、現在のBigIntegerオブジェクトが表す値が素数であるかどうかを判定するメソッドです。引数には判定の「確実性(certainty)」を表す整数値を指定
-
【Java】素数を判定して次の素数を見つけるプログラムの作り方
素数とは? 素数とは、1より大きい整数のうち、約数が「1」と「その数自身」の2つだけを持つ数のことです。それ以外の正の約数は一切持ちません。たとえば7は「7 = 1 × 7」としか分解できないため、素数です。 素数判定のアルゴリズム ある数が素数かどうかを調べるには、以下の手順が基本になります。 判定対象の整数を変数Aに代入する。 Aを2からA−1までの整数で順番に割っていく。 途中で一度でも割り切れたら、Aは素数ではない。 最後まで割り切れる数が現れなければ、Aは素数である。 なお、実際のプログラムでは「√Aまで調べれば十分」という性質を利用すると処理を大幅に高速化できます。これは、A