次の 2 つの式の違いは何ですか?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
次の 2 つの式の違いは何ですか?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
最初のものは単一の空白に一致しますが、2 番目のものは 1 つまたは複数の空白に一致します。それらはいわゆる正規表現量指定子であり、次のような一致を実行します (ドキュメントから取得):
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 つの動作は異なります。
まず、両方のステートメントの最終出力が同じになることを理解する必要があります。つまり、指定された文字列からすべてのスペースを削除します。
ただし、正規表現が一度に 1 つ以上のスペースに一致し、それらを空の文字列に置き換えるx.replaceAll("\\s+", "");
という事実により、置換が少なくなる可能性があるため、スペースをトリミングするより効率的な方法になります (文字列に複数の連続したスペースを含めることができる場合) 。\\s+
したがって、両方から同じ出力が得られたとしても、次を使用することをお勧めします。
x.replaceAll("\\s+", "");
最初の正規表現は、1 つの空白文字に一致します。2 番目の正規表現は、しぶしぶ 1 つ以上の空白文字に一致します。ほとんどの場合、これら 2 つの正規表現は非常に似ていますが、2 番目のケースでは、正規表現の一致が失敗しないようにすれば、正規表現はより多くの文字列と一致できます。http://www.coderanch.com/t/570917/java/java/regex-differenceから