1

次の正規表現があります。

var regEx = /^\W*(.*?)\W*$/;
var regEx2 = /^\W*(.*)\W*$/;
  1. (.*?)実際にはどういう意味ですか?(.*?)との違いは何(.*)ですか?
  2. なぜJavascriptでregEx.exec("abc ")戻るのですか?['abc ', 'abc']
  3. なぜJavascriptでregEx2.exec("abc ")戻るのですか?['abc ', 'abc ']
4

3 に答える 3

4
  1. ?数量詞、、などの後に*追加+すると{n,m}、デフォルトの欲張りマッチングとは対照的に、気が進まない/怠惰なマッチングになります。名前からするとかなり直感的です。貪欲とは、可能な限り多くの人と一致しようとすることを意味します。レイジーとは、可能な限り一致させようとすることを意味します。

  2. 単語以外の\Wトークンはないため、\W*空の文字列に一致します。次に、一致するもの(.*?)をできるだけ少なくしますが、\W*何かに一致するかどうかを確認します。したがって、(.*?)一致してキャプチャ "abc"し、\W*(単語以外の)スペースと一致します。

  3. 上記とほぼ同じですが、(.*)可能な限り消費し、一致してキャプチャし "abc "、一致\W*する空の文字列が残ります。

2と3の場合、戻り配列の2番目の要素は、正規表現の最初のキャプチャグループによってキャプチャされたテキストです。配列の最初の要素は、正規表現全体に一致するテキストです。

于 2012-07-10T05:46:12.260 に答える
3

(。*?)は実際にはどういう意味ですか?

一致するグループ内で、任意の文字を0回以上非貪欲に一致させます。

regEx.exec( "abc")がJavascriptで['abc'、'abc']を返すのはなぜですか?

一致するグループごとに配列のメンバーを1つ取得します。インデックス0の要素は完全一致であり、次の要素は上記の最初の(そして唯一の)一致グループからのものです。

regEx2.exec( "abc")がJavascriptで['abc'、'abc']を返すのはなぜですか?

上記と同じ理由で、今回を除いて、貪欲な試合は最後のスペースにも一致するため、この場合、最初のキャプチャグループは完全な試合と同じになります。

于 2012-07-10T05:37:18.913 に答える
0

さて、私が見つけた正規表現を見るときに最も簡単なことは、それらを分解して、各部分が何をしているのかを書き出すことです。

したがって、最初の正規表現を使用します/^\W*(.*?)\W*$/

^        Start of search string
\W*      Match a non-word character zero or more times
(        Start of group
  .*?    Match any character (except a line terminator) zero or more times but as few as possible
)        End of group
\W*      Match a non-word character zero or more times
$        End of search string

このexecメソッドはテキストを検索し、文字列の配列を返します(失敗した場合はnullを返します)。要素0の文字列は、式全体に一致するサブ文字列です。この後の文字列は、個々のキャプチャグループに対応する文字列です。

したがって、最初の例では、式全体がキャプチャされています"abc "が、(.*?)グループがキャプチャ"abc"されているため、配列に2つのアイテムが含まれています。

于 2012-07-10T05:49:08.647 に答える