Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの正規表現(RegEx)を使って文字列内のすべての大文字を末尾に移動する方法

正規表現のサブ式「[ ]」は、角括弧内で指定されたすべての文字に一致します。この性質を利用すると、文字列内のすべての大文字を検出して末尾に移動することができます。

大文字を末尾に移動する手順

  • 対象の文字列に含まれるすべての文字を先頭から順に反復処理します。

  • 正規表現「[A-Z]」を使用して、文字列内のすべての大文字に一致させます。

  • 一致した大文字とそれ以外の文字を、それぞれ別の文字列に振り分けて連結します。

  • 最後に、大文字を集めた文字列を、残りの文字列の後ろに連結します。

例1:charAt()とmatches()を使った基本的な実装

public class RemovingSpecialCharacters {
   public static void main(String args[]) {
      String input = "sample B text C with G upper case LM characters in between";
      String regex = "[A-Z]";
      String specialChars = "";
      String inputData = "";
      for(int i=0; i< input.length(); i++) {
         char ch = input.charAt(i);
         if(String.valueOf(ch).matches(regex)) {
            specialChars = specialChars + ch;
         } else {
            inputData = inputData + ch;
         }
      }
      System.out.println("Result: "+inputData+specialChars);
   }
}

出力結果

Result: sample text with upper case characters in betweenBCGLM

このプログラムでは、forループで1文字ずつ取り出し、matches()メソッドによってその文字が「[A-Z]」に一致するかどうかを判定しています。大文字であればspecialCharsへ、それ以外はinputDataへ追加していき、最後に両者を連結することで大文字が末尾に集められます。

例2:PatternクラスとMatcherクラスを使った実装

次に示すのは、java.util.regexパッケージが提供するPatternクラスとMatcherクラスのメソッドを活用し、文字列内の大文字を末尾へ移動するJavaプログラムです。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
   public static void main(String args[]) {
      String input = "sample B text C with G upper case LM characters in between";
      String regex = "[A-Z]";
      String specialChars = "";
      System.out.println("Input string: \n"+input);
      // パターンオブジェクトを作成
      Pattern pattern = Pattern.compile(regex);
      // コンパイル済みパターンを文字列に対してマッチング
      Matcher matcher = pattern.matcher(input);
      // 空のStringBufferを作成
      StringBuffer sb = new StringBuffer();
      while (matcher.find()) {
         specialChars = specialChars+matcher.group();
         matcher.appendReplacement(sb, "");
      }
      matcher.appendTail(sb);
      System.out.println("Result: \n"+ sb.toString()+specialChars );
   }
}

出力結果

Input string:
sample B text C with G upper case LM characters in between
Result:
sample text with upper case characters in betweenBCGLM

この例では、まずPattern.compile()で正規表現をコンパイルし、matcher()メソッドで入力文字列に対するMatcherオブジェクトを生成します。whileループ内のfind()で大文字を順番に検出し、group()で一致した文字を取得してspecialCharsに蓄積します。同時にappendReplacement()により、元の文字列から大文字を除去した結果をStringBufferに構築し、最後にappendTail()で残りの部分を追加しています。

まとめ

どちらの方法でも同じ結果が得られますが、単純な文字判定なら例1のmatches()方式が直感的で分かりやすく、より高度なパターンマッチングや置換処理を行いたい場合は例2のPattern/Matcher APIを使う方法が柔軟で効率的です。用途に応じて使い分けるとよいでしょう。

  1. 【Python】正規表現(Regex)で文字列内の「1(0+)1」パターンをすべて検索する方法

    このチュートリアルでは、Pythonの正規表現(regex)を使って、文字列内に含まれる「1(0+)1」というパターンをすべて検出するプログラムを作成します。Pythonには正規表現を扱うためのreモジュールが標準で用意されており、これを活用することでパターンマッチングを簡単に実装できます。 サンプルケース まず、どのような動作になるのかサンプルを見てみましょう。 入力:string = Sample 1(0+)1 string with 1(0+)1 unnecessary patterns 1(0+)1出力:パターンの一致数:3件[1(0+)1, 1(0+)1, 1(0+)1] それでは、

  2. Pythonの正規表現(Regex)で文字列内の「10+1」パターンをすべて検索する方法

    Pythonの正規表現で「10+1」パターンをすべて検索する 与えられた文字列の中から、正規表現パターン「10+1」に一致する部分をすべて見つけたいケースはよくあります。ここでの「10+1」は、「1」の後に「0」が1回以上続き、その後に再び「1」が続く並びを意味します。Pythonでは、標準ライブラリのreモジュールを使うことで、このような検索を簡単に実現できます。 reモジュールにはfindall()という便利なメソッドが用意されています。このメソッドは正規表現パターンと検索対象の文字列を引数に受け取り、マッチしたすべての箇所をリストとして返します。 入力例 10000001 hello