Java正規表現で数字と英字の間にスペースを挿入する方法
正規表現では、パターンの一部を丸括弧 () で囲むことで「キャプチャグループ(マッチグループ)」を作成できます。たとえば、次の正規表現では、第1グループが数字に、第2グループが英字(アルファベット)にそれぞれマッチします。
(\\d)([A-Za-z])
これは、入力文字列の中から「数字の直後に英字が続く部分」にマッチすることを意味します。
置換文字列において $1 は第1グループ、$2 は第2グループへの後方参照を表します。したがって、Stringクラスの replaceAll() メソッドを使ってこの正規表現を $1 $2 に置き換えると、数字の直後に単語が続くすべての箇所へ、自動的にスペースが挿入されます。
サンプルコード
import java.util.Scanner;
public class SampleTest {
public static void main(String args[]) {
// ユーザーからの入力を読み込む
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
// 数字+英字の並びの間にスペースを挿入
String result = input.replaceAll("(\\d)([A-Za-z])", "$1 $2");
System.out.println(result);
}
}実行結果
Enter input text: 21This 23is 56sample 99text 21 This 23 is 56 sample 99 text
英字→数字・数字→英字の両方の順序に対応させる方法
同様に、出現順序にかかわらず「数字と英字の間」すべてにスペースを追加したい場合は、次の正規表現を半角スペースに置き換えます。
(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])
このパターンで使われているのは、実際の文字を消費しない「ゼロ幅アサーション」です。
- (?<=[A-Za-z]) … 後読み(ルックビハインド): 直前の文字が英字であることを確認
- (?=[0-9]) … 先読み(ルックアヘッド): 直後の文字が数字であることを確認
これらを組み合わせることで、「英字と数字の境界」および「数字と英字の境界」のどちらにもマッチでき、元の文字を壊すことなく境界位置だけにスペースを挿入できます。
サンプルコード
import java.util.Scanner;
public class SampleTest {
public static void main(String args[]) {
String regex = "(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])";
// ユーザーからの入力を読み込む
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
// 文字種の境界位置にスペースを挿入
String result = input.replaceAll(regex, " ");
System.out.println(result);
}
}実行結果
Enter input text: 21This23is56sample99text 21 This 23 is 56 sample 99 text
-
JavaのStringBufferとStringBuilderの違いとは?徹底比較
Javaには、文字列を効率的に操作するための可変(ミュータブル)クラスとしてStringBufferとStringBuilderの2つが用意されています。どちらも文字列の反転や連結といった操作が可能で、Stringのように新しいオブジェクトを生成することなく、既存の文字列を直接変更できるのが特徴です。両者の大きな違いはスレッドセーフ性にあります。StringBufferはスレッドセーフである一方、StringBuilderはスレッドセーフではありません。その分、StringBuilderの方が高速に動作します。また、文字列連結演算子「+」は、内部でStringBufferまたはStringBu
-
Javaでカウンタープログラムを実装する方法をわかりやすく解説
この記事では、JavaのSwingを使ってシンプルなカウンター(数を数える)アプリケーションを実装する方法を解説します。このプログラムでは、JLabelでカウント用のラベルを表示し、JTextFieldで現在のカウント値を保持し、JButtonで「追加(Add)」「削除(Remove)」「リセット(Reset)」の3つのボタンを作成します。 「Add」ボタンをクリックするとJTextField内のカウントが1ずつ増加し、「Remove」ボタンをクリックすると1ずつ減少します。さらに「Reset」ボタンをクリックすると、カウントは0にリセットされます。 実装例 import java.awt.*