次の正規表現があります。
var regEx = /^\W*(.*?)\W*$/;
var regEx2 = /^\W*(.*)\W*$/;
(.*?)
実際にはどういう意味ですか?(.*?)
との違いは何(.*)
ですか?- なぜJavascriptで
regEx.exec("abc ")
戻るのですか?['abc ', 'abc']
- なぜJavascriptで
regEx2.exec("abc ")
戻るのですか?['abc ', 'abc ']
次の正規表現があります。
var regEx = /^\W*(.*?)\W*$/;
var regEx2 = /^\W*(.*)\W*$/;
(.*?)
実際にはどういう意味ですか?(.*?)
との違いは何(.*)
ですか?regEx.exec("abc ")
戻るのですか?['abc ', 'abc']
regEx2.exec("abc ")
戻るのですか?['abc ', 'abc ']
?
数量詞、、などの後に*
追加+
すると{n,m}
、デフォルトの欲張りマッチングとは対照的に、気が進まない/怠惰なマッチングになります。名前からするとかなり直感的です。貪欲とは、可能な限り多くの人と一致しようとすることを意味します。レイジーとは、可能な限り一致させようとすることを意味します。
単語以外の\W
トークンはないため、\W*
空の文字列に一致します。次に、一致するもの(.*?)
をできるだけ少なくしますが、\W*
何かに一致するかどうかを確認します。したがって、(.*?)
一致してキャプチャ "abc"
し、\W*
(単語以外の)スペースと一致します。
上記とほぼ同じですが、(.*)
可能な限り消費し、一致してキャプチャし "abc "
、一致\W*
する空の文字列が残ります。
2と3の場合、戻り配列の2番目の要素は、正規表現の最初のキャプチャグループによってキャプチャされたテキストです。配列の最初の要素は、正規表現全体に一致するテキストです。
(。*?)は実際にはどういう意味ですか?
一致するグループ内で、任意の文字を0回以上非貪欲に一致させます。
regEx.exec( "abc")がJavascriptで['abc'、'abc']を返すのはなぜですか?
一致するグループごとに配列のメンバーを1つ取得します。インデックス0の要素は完全一致であり、次の要素は上記の最初の(そして唯一の)一致グループからのものです。
regEx2.exec( "abc")がJavascriptで['abc'、'abc']を返すのはなぜですか?
上記と同じ理由で、今回を除いて、貪欲な試合は最後のスペースにも一致するため、この場合、最初のキャプチャグループは完全な試合と同じになります。
さて、私が見つけた正規表現を見るときに最も簡単なことは、それらを分解して、各部分が何をしているのかを書き出すことです。
したがって、最初の正規表現を使用します/^\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つのアイテムが含まれています。