103

次の 2 つの式の違いは何ですか?

x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
4

4 に答える 4

96

最初のものは単一の空白に一致しますが、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
于 2013-03-25T22:02:05.680 に答える
61

これら 2 つのreplaceAll呼び出しは、内容に関係なく、常に同じ結果を生成しxます。ただし、2 つの正規表現は同じではないことに注意してください。

  • \\s- 単一の空白文字に一致
  • \\s+- 1 つ以上の空白文字のシーケンスに一致します。

\\s+この場合、すべてを空の文字列に置き換えているため、違いはありません (ただし、効率の観点から使用する方が良いでしょう)。空でない文字列に置き換えた場合、2 つの動作は異なります。

于 2013-03-25T22:04:22.197 に答える
11

まず、両方のステートメントの最終出力が同じになることを理解する必要があります。つまり、指定された文字列からすべてのスペースを削除します。

ただし、正規表現が一度に 1 つ以上のスペースに一致し、それらを空の文字列に置き換えるx.replaceAll("\\s+", "");という事実により、置換が少なくなる可能性があるため、スペースをトリミングするより効率的な方法になります (文字列に複数の連続したスペースを含めることができる場合) 。\\s+

したがって、両方から同じ出力が得られたとしても、次を使用することをお勧めします。

x.replaceAll("\\s+", "");
于 2013-03-25T22:04:31.383 に答える
2

最初の正規表現は、1 つの空白文字に一致します。2 番目の正規表現は、しぶしぶ 1 つ以上の空白文字に一致します。ほとんどの場合、これら 2 つの正規表現は非常に似ていますが、2 番目のケースでは、正規表現の一致が失敗しないようにすれば、正規表現はより多くの文字列と一致できます。http://www.coderanch.com/t/570917/java/java/regex-differenceから

于 2013-03-25T22:02:42.147 に答える