1

私はいくつかの基本的なJavascript正規表現を学ぼうとしています。手始めに、私はドキュメントとこのSOの質問を読みました: JavaScript正規表現で一致したグループにどのようにアクセスしますか?

私はほとんどの表現を解読したと思います:

/(?:^|\s)format_(.*?)(?:\s|$)/g

この部分を除いて:

(.*?)

そんなこと知ってる

.*

任意の文字の0回以上の出現に一致することです(改行または行末記号を除く)。

しかし、なぜ私は理解できません

?

が必要です。

私は似たようなもので遊んでいました:

/(?:^|\s)ab(.*?)ab(?:\s|$)/
' ab4545ab '

そして、物事は、

?

(.*?)

何かご意見は?

ありがとう!

4

3 に答える 3

5

It makes the .* non-greedy. This means that the first occurrence of the next valid character sequence in the regex will halt the .*.

Without the ?, the .* will consume until the last occurrence of the next valid character sequence in the regex.

var s = "foo bar boo bar foo";

var greedy = /.*bar/;
var no_greed = /.*?bar/;

greedy.exec(s); // foo bar boo bar

no_greed.exec(s); // foo bar

So the greedy one consumes past the first "bar" to the last "bar".

The non-greedy only goes to the first "bar".

于 2012-06-12T19:17:08.870 に答える
4

The ? after a .+ or .* match will make the match lazy instead of the default greedy. Meaning, it will match as few characters as possible, in contrast to as many.

Example:

"hello".match(/.+/)    //Returns ["hello"]
"hello".match(/.+?/)   //Returns ["h"]
于 2012-06-12T19:17:13.473 に答える
2

?、数量詞を貪欲にしません。これがないと、は*できるだけ多くの文字を消費します。これは、で特に強力.です。しかし、?そこにあると、それは必要なだけ食べるでしょう。

この文字列を例にとると、:"abcccbacba"、と照合し/abc(.*)ba/ます。キャプチャになりccbacます。一方、/abc(.*?)ba/キャプチャしccます。

于 2012-06-12T19:19:14.983 に答える