1

我正在尝试学习一些基本的 Javascript 正则表达式。作为初学者,我阅读了文档和这个 SO 问题: 如何访问 JavaScript 正则表达式中的匹配组?

我想我已经破译了大部分表达:

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

除了这部分:

(.*?)

我知道

.*

是匹配 0 次或多次出现的任何字符(换行符或行终止符除外)。

但我无法弄清楚为什么

?

是需要的。

我在玩类似的东西:

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

无论有没有

?

(.*?)

有什么想法吗?

谢谢!

4

3 回答 3

5

它使.*非贪婪。这意味着正则表达式中下一个有效字符序列的第一次出现将停止.*.

如果没有?.*将一直消耗到正则表达式中下一个有效字符序列的最后一次出现。

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

所以贪婪的人会从第一个“条”消耗到最后一个“条”。

非贪婪者只去第一个“酒吧”。

于 2012-06-12T19:17:08.870 回答
4

?after a .+or .*match 将使匹配变得惰性,而不是默认的greedy。意思是,它将匹配尽可能少的字符,而不是尽可能多的字符。

例子:

"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 回答