web-dev-qa-db-ja.com

Java \\ s vs. \\ s +の正規表現

これらの表現の違いは何ですか

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

最初のものは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
73
Óscar López

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

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

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

44
arshajii

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

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

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

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

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

2
evgenyl