severaltipsaboutRegularExpressions
1.processfor”greedy”
Bydefault,thequantifiersare”greedy”,thatis,they
matchasmuchaspossible(uptothemaximumnumberofper-
mittedtimes),withoutcausingtherestofthepatternto
fail.Theclassicexampleofwherethisgivesproblemsisin
tryingtomatchcommentsinCprograms.Theseappearbetween
thesequences/*and*/andwithinthesequence,inpidual
*and/charactersmayappear.AnattempttomatchCcom-
mentsbyapplyingthepattern
/*.**/
tothestring
/*firstcommand*/notcomment/*secondcomment*/
fails,becauseitmatchestheentirestringduetothe
greedinessofthe.*item.
However,ifaquantifierisfollowedbyaquestionmark,
thenitceasestobegreedy,andinsteadmatchestheminimum
numberoftimespossible,sothepattern
/*.*?*/
小結:
?與/U有類似功能,但同時出現彼此抵消
如下:
<?
$a=”asdf/*asdfaldsfasdf*/asfdasldf;kfldsj*/asfddsaf”;
$pattern=”//*.*?*//”;
//$pattern=”//*.**//U”;
//$pattern=”//*.*?*//U”;
preg_match($pattern,$a,$match);
print_r($match);
?>
2.Assertions
w+(?=;)
matchesawordfollowedbyasemicolon,butdoesnotinclude
thesemicoloninthematch,and
foo(?!bar)
matchesanyoccurrenceof”foo”thatisnotfollowedby
”bar”.Notethattheapparentlysimilarpattern
小結:
(?!)隻前向判斷匹配,如bar(?!foo),而(?!foo)bar沒有意義
(?<!)隻後向判斷匹配,如(?<!foo)bar,而foo(?<!bar)沒有意義