2017-01-11 4 views
0

は、誰もが説明できますか?最初の例では、テキストは1つ以上のスペースを削除しないで、2番目の例ではテキストを削除します。正規表現の違い

答えて

1

String.replaceAllメソッドは文字列を1回だけ解析し、\Wにはすでに\sが含まれています。そのため、ブランチは、最初のコードでは決してテストされません(左の最初のブランチ)。

2番目のコードでは、文字列全体が別の時刻に\s+で解析されます。

+0

おかげで、しかし、\ S +は最初のものであるとき、それはまだ動作しません。 – Helosze

+0

@Helosze:明らかに '\ W'と数字の文字はスペースで置き換えられていないので、 1回のパスで同じ結果を得るには、 '[\\ W \\ d] +' –

+0

okですが、状況は - text [space] [space] [space] text - 3つのスペースを\ sで1つのスペース? – Helosze

-1

\Wは、空白文字を含む単語以外の文字([^a-zA-Z0-9_])を意味します。

したがって、最初のパターンでは、\s+の部分は冗長です.1つの空白文字に一致し、それを" "に置き換えます。 JavaのreplaceAllメソッドは、文字列を1回だけ解析します。

0

REGEXP:

\w <= [^a-zA-Z0-9_] and whitespace 
\d <= numbers 
\s+ { 
\s <= whitespace 
+ <= 1 or more... 
} 

例:(+)

\w+ <= [^a-zA-Z0-9_] and whitespace(1 or more) 
\d+ <= numbers(1 or more) 

結果: "\ W +" の

hello123 => hello 

結果:用

hello123 => hello123 

をお楽しみください "\ + \ D + W": "\ dの+"

hello123 => 123 

結果について。

1

最初の例では、\ Wはそれぞれのスペースを取ります(したがって\ s +はありません)ので、スペースで置き換えます。 それでも2番目の例では起こりますが、\ s +は\ W | \ dの後に別々に動作し、多くのスペースを1つのスペースのcharに折り畳みます。

try try text。でReplaceAll( "[\\ W \\ D \\ S] +"、」「)

1

あなたの最初の例:\W|\d|\s+試合:

  • つの非単語文字(\W
  • OR 1桁の文字(\d
  • または1または-以上のスペース(\s+

それは怠け者だOR、そのそれぞれが '' \Wと一致し、置き換えられます

おそらく(\W|\d|\s)+が必要で、グループ全体が繰り返されます。ただし、\s\Wに含まれているため、ここでは冗長です。単一文字の場合

は、それが|ではなく文字クラスを使用するために、通常は簡単です:

[\W\d]+.