2012-06-12 116 views
1

我想学习一些基本的Javascript正则表达式。作为初学者,我阅读文档,这太问题: How do you access the matched groups in a JavaScript regular expression?Javascript的正则表达式

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

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

除本部分:

(.*?) 

我知道,

.* 

是匹配0或更多次出现的任何字符(除了换行符或行结束符)。

但为什么需要

? 

我想不通。

我用类似的东西打:

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

而且事情已经表现同样带有或不带有

? 

(.*?) 

有什么想法?

谢谢!

+1

在这种情况下的问号意味着做一个懒惰的匹配。 – jahroy

+0

http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/ –

+0

确实读过这篇文章 - 非常棒的教程,有用的例子和所有要点:http://www.regular-expressions.info /tutorial.html,特别是http://www.regular-expressions.info/repeat.html#lazy –

回答

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 

因此,贪婪的人消耗过去第一个“酒吧”到最后一个“酒吧”。

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

4

?一个.+.*赛后将这场比赛,而不是默认贪婪。意思是,尽可能少的字符相匹配,而不是多。

实施例:

"hello".match(/.+/) //Returns ["hello"] 
"hello".match(/.+?/) //Returns ["h"] 
2

?使得量词ungreedy。没有它,*会吃尽可能多的字符,这是.特别强大。然而,在那里,它会吃得尽可能少。

取这个字符串,例如:"abcccbacba",并将其与/abc(.*)ba/匹配。这将导致捕获ccbac。另一方面,/abc(.*?)ba/将捕获cc