Javaの正規表現、\\ sと\\ s +


回答:


88

最初のものは単一の空白に一致し、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

20
私は、各量指定子の貪欲、消極的、所有的バージョンの個別の説明を提供し、3つすべてについてまったく同じことを言うのが好きでした。;)
アランムーア

60

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

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

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


最初の行、つまりxが「ドメインを予約して取得\ n \ n \ n \ n \ n \ n今日オンライン」の場合。どちらも同じ結果になりますか?
sofs1

3
@ user3705478両方の後にスペースが複数ある場合でも、どちらも同じ結果になります。違いは、その処理方法にあります。たとえば、3つのスペースのグループが互いに直接続く場合、\\ s +はそのグループを取得してグループ全体を ""に変換しますが、\\ sはすべてのスペースを独自に処理します。
Dennie

11

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

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

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

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

2

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


「しぶしぶ」という言葉をスクラッチします。この質問はに関するもの\s+であり\s+?、他の質問とは異なります。
アランムーア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.