天天看點

JavaScript正則使用點滴

寫在前面:關于“railroad diagrams”,摘抄自網絡:http://202.207.0.245:9001/jisuanjifazhanshi/tuling/19.htm

    我們目前所看到的許多語言的BNF實際上是EBNF,不過人們往往忽略掉這個E字。和BNF一起出現的,還常常有一些看上去像鐵路圖那樣的圖形,稱作“文法圖”(syntax chart或syntax diagram)或“鐵路圖”(railroad diagram),這也是由沃思所設計與發明的,這種圖形标記法的描述能力等價于BNF,但當然更易于閱讀與了解,更加直覺。

p.s:可惜源位址的圖不全,,不然……

正則複雜起來可能會感覺有點繁複(slightly less terse),但正确性會提高(slightly easier to use correctly)。

JS的正則不支援空白符,是以不支援注釋。《Good Parts》理由竟然是安全理由:

This is a particular concern when the are used in security applications for scanning and validation.

但一方面書中又提出:

If you cannot read and understand a regular expression, how can you have confidence that it will work correctly for all input?

最後道出某種無奈:

Yet, despite their obvious drawbacks, regular expresssions are widely used.

什麼是Sloppy Regluar Experssions?就是與Rigorous Regular Expresssions相對的正則。雖然寫起來容易,但它是許多安全的問題的來源!?

Sloppy regular expressions are a popluar source of security exploits.

D.C指出JS的RegExp庫的相容性問題最少,因為這玩意的核心複雜的很,一般不會作多大的變動。注意用literal方式寫正則其實是共享一個執行個體。例如:

function makeMatcher(){

return /a/gi;

}

var x = makeMatcher();

var y = makeMatcher();

// Beware: x and y are the same object!

x.lastIndex = 10;

alert(y.lastIndex); // 10說白了,其設計就是設計模式中的flyweight模式。回想起以前的一個bug不知所然,現在聯系到這一點,終于有點眉目了……呵呵

繼續閱讀