2015-09-11 7 views
11

私はIonicのソースコードを読んでいます。私は、この正規表現に出くわした、と私は "かなりそれに困惑メートルこれらの正規表現の違いは何ですか

([\s\S]+?) 

[OK]を、それはホワイトスペース、または非空白???

なぜのdidn」のいずれかであるすべての文字にグループ分けていますtは、彼らはただ

(.+?) 

を行い、私は何かが足りない?

+6

ドットは改行文字 '\ n 'と一致しません –

答えて

11

.は、任意のシンボルが、改行にマッチしています。それは改行にマッチさせるためには、ほとんどの言語で修飾(DOTALLがあります、 単線)。しかし、JSでは、そのような修飾子はありません。

したがって、回避策は\sは、すべての空白にマッチしますし、\Sは、すべての非空白文字にマッチしますので、改行を含め、すべての文字に一致します[\s\S]文字クラスを使用することです。同様に、[\d\D]または[\w\W]を使用できます。

また、JS内で同じものと一致するパターンがありますが、JavaScript固有であるため、このパターンを含む正規表現は正規表現のフレーバ間で移植できません。

+? lazy quanitifierは、前のサブパターンに適合する1つ以上のシンボルに一致しますが、できるだけ少ないシンボルに一致します。したがって、このように使用された場合は、パターンの最後に1つのシンボルだけが一致します。

+0

完全性のために:* dotall/singleline *修飾子は通常' s'です。他の味。 –

+0

Rubyの '/ m'です。 –

+0

** Argh!** - 'm'は他の味(JSを含む)でまったく違うものを意味します...なぜ彼らは' s'に固執しませんでしたか? : - \また、 'PCRE2_MULTILINE'と同じではない' Regexp :: MULTILINE'という名前を付けます。ニースはここにいる。少なくとも驚きの原則はあなたが言う? ;-) –

3

.はすべてと一致しますが、改行文字はです。これは実際にはjavascriptのよく知られた/文書化された問題です。 \s(空白と一致)とその否定\S(空白以外の一致)は、改行を含むdotallの一致を提供します。従って、[\s\S]は、一般に、より頻繁に使用されます。.

3

多くのRegexpの実現では "新しい行と一致しません。だから彼らは "[\ s \ S]"を小さなハックとして使用します)

1

使用されるRegExは、より多くの文字(本質的にすべて)を含みます。

\sは、任意の単語または数字の文字または空白に一致します。カシミールは指摘したよう

\Sは、数字、単語文字、または空白

以外のものと一致した:

.マッチ改行以外の任意の文字(\n)キャリッジリターン/r除く

1

.マッチ任意の文字をと新しい行/n

最短方法[/s/S]ドット(空白と空白以外)は[^](何もありません)

関連する問題