1. 概要

文字列の置換は、Javaで文字列を処理するときの標準的な操作です。

Stringクラスの便利なreplaceAll()メソッドのおかげで、正規表現を使用して文字列置換を簡単に行うことができます。 ただし、たとえば、式が混乱する場合があります。 \ s \s+。 

この短いチュートリアルでは、例を通して2つの正規表現の違いを見ていきます。

2. \s\s+の違い

正規表現\s は、事前定義された文字クラスです。 単一の空白文字を示します。 空白文字のセットを確認してみましょう。

[ \t\n\x0B\f\r]

プラス記号+は貪欲な数量詞であり、1回以上を意味します。 たとえば、式 X+は1つ以上のX文字と一致します。

したがって、正規表現\ sは単一の空白文字に一致し、\s+は1つ以上の空白文字に一致します。

3. replaceAll()空でない置換

正規表現\sおよび\s+の意味を学習しました。

次に、 replaceAll()メソッドがこれら2つの正規表現でどのように異なる動作をするかを見てみましょう。

すべての例の入力テキストとして文字列を使用します。

String INPUT_STR = "Text   With     Whitespaces!   ";

\ sreplaceAll()メソッドに引数として渡してみましょう。

String result = INPUT_STR.replaceAll("\\s", "_");
assertEquals("Text___With_____Whitespaces!___", result);

replaceAll()メソッドは、単一の空白文字を検索し、各一致をアンダースコアに置き換えます。 入力テキストには11個の空白文字があります。 したがって、11回の交換が行われます。

次に、正規表現 \ s +replaceAll()メソッドに渡します。

String result = INPUT_STR.replaceAll("\\s+", "_");
assertEquals("Text_With_Whitespaces!_", result);

貪欲な数量詞+により、 replaceAll()メソッドは、連続する空白文字の最長シーケンスと一致し、各一致をアンダースコアに置き換えます。

入力テキストには、連続する空白文字の3つのシーケンスがあります。 したがって、3つのそれぞれがアンダースコアになります。

4. replaceAll()空の置換あり

replaceAll()メソッドのもう1つの一般的な使用法は、入力テキストから一致するパターンを削除することです。 通常、メソッドの代わりに空の文字列を渡すことでこれを行います。

replaceAll()メソッドと \ s 正規表現を使用して空白文字を削除すると、どのような結果が得られるかを見てみましょう。

String result1 = INPUT_STR.replaceAll("\\s", "");
assertEquals("TextWithWhitespaces!", result1);

次に、他の正規表現 \ s +replaceAll()メソッドに渡します。

String result2 = INPUT_STR.replaceAll("\\s+", "");
assertEquals("TextWithWhitespaces!", result2);

置換は空の文字列であるため、2つの正規表現の意味が異なっていても、2つの replaceAll()呼び出しは同じ結果を生成します。

assertEquals(result1, result2);

2つのreplaceAll()呼び出しを比較すると、 \ s+の呼び出しの方が効率的です。 これは、 \ s を使用した呼び出しでは、11回の置換が行われるのに対し、3回の置換でのみジョブが実行されるためです。

5. 結論

この短い記事では、正規表現 \s\s+について学びました。

また、 replaceAll()メソッドが2つの式でどのように異なる動作をするかを見ました。

いつものように、コードはGitHubから入手できます。