2016-04-08 13 views
1

に負の文字クラスを組み合わせます。次のスニペットは、期待どおりに機能します。は、このような文字列が与えられた正規表現

a.gsub(/[^\w\s]/,'') 
# => "Somewhere in LaMancha in a place whose name I do not care to remember" 

ただし、次のコードは機能しません。

a.gsub(/[\W\S]/,'') 
# => "" 

理論的には、両方の正規表現は同じですが、同じ方法では機能しません。誰もその理由を知っていますか?

否定的な文字クラスを組み合わせることはできますか?

答えて

3

Theorically、両方の正規表現は、すべてではない

同等です。

これは基本的な学校レベルの論理です。

  • not (A or B)(または同等に、(not A) and (not B)
  • (not A) or (not B)

異なっています。特に、

  • [^\w\s]は:(単語またはスペース文字)ではありません。
  • [\W\S]は:非単語文字または非空白文字です。

これらは異なっています。たとえば、単語ではなく、スペースである文字は、2番目の正規表現に一致しますが、最初の正規表現には一致しません。

ネガティブ文字クラスを組み合わせることはできますか?

はい。文字クラスには、交差演算子&&があります。

/[\W&&\S]/ 

は、[^\w\s]に相当します。

+1

確かに、/ [\ W && \ S] /は私が探していた表現ですが、議論は素晴らしいです:) –

+1

文字クラスで '&&'に慣れていないので、そして、[this](http://www.rexegg.com/regex-class-operations.html)に来ました。私はユニコード文字を含む例が特に興味深いことを発見しました。 –

3

正負の文字クラスの原子間の関係が異なります。正のものでは、アトムはORされ(これに一致するかORになります)、負の文字クラスでは、要素はANDされます(これとANDされません)。

したがって、[\W\S]は、英数字/アンダースコア以外の文字と一致します。見つかった場合、空白と等しくない文字と一致します。 \Wは空白と一致し、\Sは空白と一致しないため、この[\W\S]は任意の文字と一致します。そのため、a.gsub(/[\W\S]/,'')は空の文字列を返します。

[^\w\s]は、英数字/アンダースコアではなく、空白ではない任意の文字と一致します。したがって、それは単語ではない文字と一致し、空白文字はありません([\W&&[^\s]]の構文の同義語)。 rubular demoを参照してください。

もう一つのイラスト

\Wは、すべての非ワード(または、「言葉」以外の任意の文字に一致する)文字にマッチする汎用的な速記文字クラスです。ここでは、すべての非単語文字を一致させたい場合は、;を除いて一致させたいと考えています。セミコロンは単語ではない文字です。何をしましょうか?反対のクラス\w -​​- のネゲートされた文字クラスを使用し、;をそれに追加します - >[^\w;]。この[^\w;]は、単語以外のものと一致し、;以外の文字と一致します。

+0

私はそういうネガティブなキャラクタークラスを理解するのは複雑な方法だと思います。私が理解しているのは** alwaysまたは**ですが、負の '^'は '[] 'の内容全体に適用されます。 – sawa

+0

@sawa:それをSOユーザー/将来の読者に任せましょう。何が複雑で何ではないですか。実際、私はそれが基本的な学校のレベルには同意しません。 –

+0

しかし、私は '[\ W \ S]'がどの文字にもマッチすることを指摘するために+1を与えました。 – sawa

関連する問題