你不一定知道的關(guān)于JavaScript的正則表達(dá)式
更新時(shí)間:2010年09月10日 01:33:48 作者:
關(guān)于JavaScript中的正則表達(dá)式——,你不一定知道也可能用不到,但說(shuō)不定哪天就會(huì)遭遇的幾個(gè)事實(shí)【新增一個(gè)】
這兩天在用正則表達(dá)式搞一個(gè)稍微有點(diǎn)復(fù)雜的東西,但是不同瀏覽器之間的差異可浪費(fèi)了我不少的人參。
現(xiàn)在我把正則表達(dá)式在五大主流瀏覽器(IE、Firefox、Chrome、Safari、Opera,以當(dāng)前版本為準(zhǔn))之間的差異整理一下羅列出來(lái),給大家,也算給我自己做一個(gè)備忘。
1、Firefox和Chrome會(huì)過(guò)度優(yōu)化在循環(huán)(以及其中內(nèi)嵌的函數(shù)定義)中創(chuàng)建的正則表達(dá)式,似乎它們?cè)诩僭O(shè)寫(xiě)JavaScript的人會(huì)把正則表達(dá)式的構(gòu)建和賦值寫(xiě)錯(cuò)地方。
var r;
for(var i = 0; i < 2; i++){
var x = /abc/g;
if(r)
document.write(r == x); // 第二個(gè)循環(huán)時(shí)Firefox和Chrome會(huì)輸出“true”
else
r = x;
}
2、如果你把一個(gè)有可能什么也不返回的函數(shù)作為第二個(gè)參數(shù)傳遞給replace方法,那么IE可能會(huì)直接刪除匹配的文本(在之前的測(cè)試中我總結(jié)的是Opera的行為比較獨(dú)特,現(xiàn)在看起來(lái)似乎是錯(cuò)誤的結(jié)論),而其它瀏覽器則是會(huì)將匹配的文本替換成“undefined”。
document.write('123'.replace(/2/, function(){})); // IE會(huì)輸出“13”,而其它瀏覽器輸出“1undefined3”
3、如果使用new RegExp的形式創(chuàng)建正則表達(dá)式時(shí)使用一個(gè)已有的正則表達(dá)式實(shí)例作為參數(shù),那么大部分瀏覽器都會(huì)創(chuàng)建一個(gè)基本功能相同,但完全獨(dú)立的、全新的正則表達(dá)式實(shí)例;而Safari則會(huì)很干脆地返回作為參數(shù)的那個(gè)正則表達(dá)式實(shí)例。
var r = /1/;
document.write(new RegExp(r) == r); // Safari會(huì)輸出“true”,而其它瀏覽器輸出為“false”
4、如果把一個(gè)“空”的正則表達(dá)式直接轉(zhuǎn)化成字符串,IE以外的瀏覽器都會(huì)得到“/(?:)/”,而IE會(huì)得到“//”——但從正則表達(dá)式上直接提取source屬性的時(shí)候,得到的都是空字符串。
document.write(new RegExp('')); // IE輸出“//”,其它瀏覽器輸出“/(?:)/”
document.write(eval('' + new RegExp(''))) // IE輸出“undefined”,其它瀏覽器輸出“/(?:)/”
5、如果把一個(gè)包含斜線“/”的正則表達(dá)式直接轉(zhuǎn)化成字符串——以“new RegExp('/')”為例,只有Firefox和Opera會(huì)得到“/\//”,并且直接提取source屬性會(huì)得到“\/”;而其它瀏覽器則會(huì)得到“///”,且直接提取source屬性會(huì)得到“/”。
document.write(new RegExp('/')); // Firefox和Opera輸出“/\//”,其它瀏覽器輸出“///”
document.write(eval('' + new RegExp('/'))) // Firefox和Opera輸出“/\//”,其它瀏覽器輸出“undefined”
6、如果在使用字面表達(dá)式來(lái)定義一個(gè)正則表達(dá)式時(shí),使用了無(wú)效的選項(xiàng)標(biāo)志(例如“/abc/n”),則Chrome和Safari會(huì)完全忽視此無(wú)效選項(xiàng)標(biāo)志(等同于“/abc/”),而在其它瀏覽器會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。
document.write(/abc/n); // Chrome和Safari會(huì)輸出“/abc/”,其它瀏覽器中產(chǎn)生語(yǔ)法錯(cuò)誤
7、如果通過(guò)構(gòu)造器來(lái)創(chuàng)建正則表達(dá)式時(shí),為其指定選項(xiàng)標(biāo)志的(第二個(gè))字符串參數(shù)中包含了非有效標(biāo)志的字符,在Firefox中就會(huì)引起一個(gè)異常,而其它瀏覽器會(huì)將無(wú)效的部分忽略。
document.write(new RegExp('1', 'n')); // Firefox中會(huì)引起一個(gè)異常,提示無(wú)效的標(biāo)志;而其它瀏覽器會(huì)輸出“/1/”
暫時(shí)就這些吧,發(fā)現(xiàn)新的再補(bǔ)上。
來(lái)自:http://www.cnblogs.com/NanaLich
現(xiàn)在我把正則表達(dá)式在五大主流瀏覽器(IE、Firefox、Chrome、Safari、Opera,以當(dāng)前版本為準(zhǔn))之間的差異整理一下羅列出來(lái),給大家,也算給我自己做一個(gè)備忘。
1、Firefox和Chrome會(huì)過(guò)度優(yōu)化在循環(huán)(以及其中內(nèi)嵌的函數(shù)定義)中創(chuàng)建的正則表達(dá)式,似乎它們?cè)诩僭O(shè)寫(xiě)JavaScript的人會(huì)把正則表達(dá)式的構(gòu)建和賦值寫(xiě)錯(cuò)地方。
復(fù)制代碼 代碼如下:
var r;
for(var i = 0; i < 2; i++){
var x = /abc/g;
if(r)
document.write(r == x); // 第二個(gè)循環(huán)時(shí)Firefox和Chrome會(huì)輸出“true”
else
r = x;
}
2、如果你把一個(gè)有可能什么也不返回的函數(shù)作為第二個(gè)參數(shù)傳遞給replace方法,那么IE可能會(huì)直接刪除匹配的文本(在之前的測(cè)試中我總結(jié)的是Opera的行為比較獨(dú)特,現(xiàn)在看起來(lái)似乎是錯(cuò)誤的結(jié)論),而其它瀏覽器則是會(huì)將匹配的文本替換成“undefined”。
復(fù)制代碼 代碼如下:
document.write('123'.replace(/2/, function(){})); // IE會(huì)輸出“13”,而其它瀏覽器輸出“1undefined3”
3、如果使用new RegExp的形式創(chuàng)建正則表達(dá)式時(shí)使用一個(gè)已有的正則表達(dá)式實(shí)例作為參數(shù),那么大部分瀏覽器都會(huì)創(chuàng)建一個(gè)基本功能相同,但完全獨(dú)立的、全新的正則表達(dá)式實(shí)例;而Safari則會(huì)很干脆地返回作為參數(shù)的那個(gè)正則表達(dá)式實(shí)例。
復(fù)制代碼 代碼如下:
var r = /1/;
document.write(new RegExp(r) == r); // Safari會(huì)輸出“true”,而其它瀏覽器輸出為“false”
4、如果把一個(gè)“空”的正則表達(dá)式直接轉(zhuǎn)化成字符串,IE以外的瀏覽器都會(huì)得到“/(?:)/”,而IE會(huì)得到“//”——但從正則表達(dá)式上直接提取source屬性的時(shí)候,得到的都是空字符串。
復(fù)制代碼 代碼如下:
document.write(new RegExp('')); // IE輸出“//”,其它瀏覽器輸出“/(?:)/”
document.write(eval('' + new RegExp(''))) // IE輸出“undefined”,其它瀏覽器輸出“/(?:)/”
5、如果把一個(gè)包含斜線“/”的正則表達(dá)式直接轉(zhuǎn)化成字符串——以“new RegExp('/')”為例,只有Firefox和Opera會(huì)得到“/\//”,并且直接提取source屬性會(huì)得到“\/”;而其它瀏覽器則會(huì)得到“///”,且直接提取source屬性會(huì)得到“/”。
復(fù)制代碼 代碼如下:
document.write(new RegExp('/')); // Firefox和Opera輸出“/\//”,其它瀏覽器輸出“///”
document.write(eval('' + new RegExp('/'))) // Firefox和Opera輸出“/\//”,其它瀏覽器輸出“undefined”
6、如果在使用字面表達(dá)式來(lái)定義一個(gè)正則表達(dá)式時(shí),使用了無(wú)效的選項(xiàng)標(biāo)志(例如“/abc/n”),則Chrome和Safari會(huì)完全忽視此無(wú)效選項(xiàng)標(biāo)志(等同于“/abc/”),而在其它瀏覽器會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。
復(fù)制代碼 代碼如下:
document.write(/abc/n); // Chrome和Safari會(huì)輸出“/abc/”,其它瀏覽器中產(chǎn)生語(yǔ)法錯(cuò)誤
7、如果通過(guò)構(gòu)造器來(lái)創(chuàng)建正則表達(dá)式時(shí),為其指定選項(xiàng)標(biāo)志的(第二個(gè))字符串參數(shù)中包含了非有效標(biāo)志的字符,在Firefox中就會(huì)引起一個(gè)異常,而其它瀏覽器會(huì)將無(wú)效的部分忽略。
復(fù)制代碼 代碼如下:
document.write(new RegExp('1', 'n')); // Firefox中會(huì)引起一個(gè)異常,提示無(wú)效的標(biāo)志;而其它瀏覽器會(huì)輸出“/1/”
暫時(shí)就這些吧,發(fā)現(xiàn)新的再補(bǔ)上。
來(lái)自:http://www.cnblogs.com/NanaLich
相關(guān)文章
PHP 正則表達(dá)式特殊字符 [:alnum:] [:alpha:] 等
正則表達(dá)式中有兩個(gè)很重要的特殊字符就是"[ ]"。他們可以匹配"[]"之中出現(xiàn)過(guò)的字符,比如"/[az]/"可以匹配單個(gè)字符"a"或者"z";如果把上面的表達(dá)式改成這樣"/[a-z]/",就可以匹配任何單個(gè)小寫(xiě)字母,比如"a"、"b"等等。2011-09-09正則表達(dá)式應(yīng)用之提煉百度歌詞的實(shí)現(xiàn)代碼
前幾天看了下百度音樂(lè)盒的功能,發(fā)現(xiàn)有歌詞功能,用正則匹配了下,需要的朋友可以參考下。2011-06-06js 正則表達(dá)式學(xué)習(xí)筆記之匹配字符串
這篇文章主要介紹了js 正則表達(dá)式匹配字符串,需要的朋友可以參考下2014-05-05正則表達(dá)式(regex)或操作符”|“使用易出現(xiàn)功能Bug
這篇文章主要介紹了正則表達(dá)式(regex)或操作符”|“使用易出現(xiàn)功能Bug,需要的朋友可以參考下2015-10-10PHP 正則表達(dá)式效率 貪婪、非貪婪與回溯分析(推薦)
先掃盲一下什么是正則表達(dá)式的貪婪,什么是非貪婪?或者說(shuō)什么是匹配優(yōu)先量詞,什么是忽略優(yōu)先量詞,好吧,下面通過(guò)實(shí)例給大家介紹下PHP 正則表達(dá)式效率 貪婪、非貪婪與回溯分析,一起看看吧2016-12-12學(xué)php正則!超基礎(chǔ)簡(jiǎn)單例子
我一直都覺(jué)得正則表達(dá)式只要在要用的時(shí)候翻一下百度就Ok了,然后今天寫(xiě)php的時(shí)候發(fā)現(xiàn),原來(lái)我正則完全一點(diǎn)都不懂。2011-09-09PHP preg match正則表達(dá)式函數(shù)的操作實(shí)例
在php中preg_match()函數(shù)是用來(lái)執(zhí)行正則表達(dá)式的一個(gè)常用的函數(shù)。本文給大家介紹PHP preg match正則表達(dá)式函數(shù)的操作實(shí)例,需要的朋友參考下2016-04-04