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

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

次の正規表現は、英字・数字・空白以外のすべての特殊文字にマッチします。つまり、英語のアルファベット、スペース、数字を除く全ての文字を検出できます。

"[^a-zA-Z0-9\\s+]"

文字列内の特殊文字をすべて末尾へ移動するには、まずこの正規表現を使って特殊文字を検出し、見つかったものを順番に1つの空文字列へ連結していきます。同時に、特殊文字以外の残りの文字を別の文字列へ連結し、最後にこの2つの文字列を結合することで目的の結果が得られます。

ここでは、2つの実装方法を紹介します。

例1:charAt()メソッドとmatches()メソッドを使う方法

1文字ずつ取り出して正規表現と照合し、特殊文字かどうかを判定するシンプルな方法です。

public class RemovingSpecialCharacters {
    public static void main(String args[]) {
        String input = "sample # text * with & special@ characters";
        String regex = "[^a-zA-Z0-9\\s+]";
        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 special characters#*&@

このコードでは、入力文字列を先頭から1文字ずつ走査し、正規表現にマッチした文字(特殊文字)はspecialCharsへ、それ以外の文字はinputDataへそれぞれ連結しています。最後に両者を結合して出力することで、特殊文字だけが文字列の末尾に集まった状態になります。

例2:java.util.regexパッケージを使う方法

続いて、Regexパッケージ(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 # text * with & special@ characters";
        String regex = "[^a-zA-Z0-9\\s+]";
        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 # text * with & special@ characters
Result:
sample text with special characters#*&@

この方法では、Pattern.compile()で正規表現をコンパイルし、Matcherのfind()メソッドで特殊文字を順に検出します。マッチした文字はmatcher.group()で取得してspecialCharsに蓄積し、appendReplacement()で元の位置から削除します。最後にappendTail()で残りの部分を追加すれば、特殊文字が末尾にまとめられた文字列が完成します。

どちらの方法でも同じ結果が得られますが、長い文字列を扱う場合は、Pattern・Matcherを使った例2の方が効率的です。また、実運用では文字列連結の代わりにStringBuilderやStringBufferを使用すると、さらにパフォーマンスが向上します。

  1. Pythonの正規表現で文字列内のすべての数値を抽出する方法

    テキストから数値だけを取り出す処理は、Pythonによるデータ分析において非常によくある要件です。Pythonの正規表現ライブラリ「re」モジュールを使えば、この処理を簡単に実現できます。正規表現ライブラリでは、数字にマッチするパターンを定義し、そのパターンに合致する部分を部分文字列として抽出できます。基本的な例以下の例では、reモジュールが提供するfindall()関数を使用しています。この関数には、抽出したいパターンと、抽出元となる文字列の2つの引数を渡します。なお、下記の例では整数部分のみが取得され、小数点や負の符号は含まれない点に注意してください。import re str = inp

  2. 【Python】正規表現で文字列の末尾にマッチさせる方法

    文字列の末尾にマッチさせるには Pythonのreモジュールを使うと、正規表現によって文字列の末尾にある特定のパターンを簡単に抽出できます。文字列の最後に一致させるには、正規表現のメタ文字である $ を使用します。 $ は「文字列の終わり」を表す特殊文字です。パターンの末尾にこの記号を付けることで、文字列の最後にある単語だけをマッチさせることができます。 以下のコードでは、文字列「cheer leaders at the football stadium」の末尾にある単語「stadium」をマッチさせています。 コード例 import re s = cheer leaders at the