これらの表現の違いは何ですか
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
最初のものは1つの空白に一致し、2番目のものは1つ以上の空白に一致します。それらはいわゆる正規表現量指定子であり、次のようなマッチを実行します( documentation から取得):
Greedy quantifiers
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times
Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, at least n but not more than m times
Possessive quantifiers
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+ X, exactly n times
X{n,}+ X, at least n times
X{n,m}+ X, at least n but not more than m times
これらの2つのreplaceAll
呼び出しは、x
が何であるかに関係なく、常に同じ結果を生成します。ただし、2つの正規表現は同じではないことに注意することが重要です。
\\s
-単一の空白文字に一致\\s+
-1つ以上の空白文字のシーケンスに一致します。この場合、すべてを空の文字列に置き換えているため、違いはありません(ただし、効率の観点からは\\s+
を使用した方が良いでしょう)。空でない文字列で置き換える場合、2つの動作は異なります。
まず、両方のステートメントの最終出力が同じになること、つまり、指定された文字列からすべてのスペースを削除することを理解する必要があります。
ただし、正規表現\\s+
が一度に1つ以上のスペースに一致し、それらを空の文字列に置き換えるため、置換の数が少なくなる可能性があるため、x.replaceAll("\\s+", "");
はスペースをトリミングするより効率的な方法になります(ストリングに複数の連続したスペースがある場合)。
したがって、両方から同じ出力を取得しても、使用することをお勧めします。
x.replaceAll("\\s+", "");
最初の正規表現は、1つの空白文字に一致します。 2番目の正規表現は、しぶしぶ1つ以上の空白文字に一致します。ほとんどの目的で、これら2つの正規表現は非常に似ていますが、2番目の場合を除き、正規表現の一致が失敗するのを防ぐ場合、正規表現はより多くの文字列に一致できます。 from http://www.coderanch.com/t/570917/Java/java/regex-difference