關於js正則表達式g,i,m 參數的總結


對於表達式對象的exec方法,不加入g,則只返回第一個匹配,無論執行多少次均是如此,如果加入g,則第一次執行也返回第一個匹配,再執行返回第二個匹配,依次類推。例如


為了解答“正則表達式(/[^0-9]/g,'')中的"/g"是什么意思?”這個問題,也為了能夠便於大家對正則表達式有一個更為綜合和深刻的認識,我將一些關鍵點和容易犯糊塗的地方再系統總結一下。

總結1:附件參數g的用法

表達式加上參數g之后,表明可以進行全局匹配,注意這里“可以”的含義。我們詳細敘述:

1)對於表達式對象的exec方法,不加入g,則只返回第一個匹配,無論執行多少次均是如此,如果加入g,則第一次執行也返回第一個匹配,再執行返回第二個匹配,依次類推。例如
var regx=/user\d/;
var str=“user18dsdfuser2dsfsd”;
var rs=regx.exec(str);//此時rs的值為{user1}
var rs2=regx.exec(str);//此時rs的值依然為{user1}
如果regx=/user\d/g;則rs的值為{user1},rs2的值為{user2}
通過這個例子說明:對於exec方法,表達式加入了g,並不是說執行exec方法就可以返回所有的匹配,而是說加入了g之后,我可以通過某種方式得到所有的匹配,這里的“方式”對於exec而言,就是依次執行這個方法即可。

2)對於表達式對象的test方法,加入g於不加上g沒有什么區別。

3)對於String對象的match方法,不加入g,也只是返回第一個匹配,一直執行match方法也總是返回第一個匹配,加入g,則一次返回所有的匹配(注意這與表達式對象的exec方法不同,對於exec而言,表達式即使加上了g,也不會一次返回所有的匹配)。例如:
var regx=/user\d/;
var str=“user1sdfsffuser2dfsdf”;
var rs=str.match(regx);//此時rs的值為{user1}
var rs2=str.match(regx);//此時rs的值依然為{user1}
如果regx=/user\d/g,則rs的值為{user1,user2},rs2的值也為{user1,user2}

4)對於String對象的replace方法,表達式不加入g,則只替換第一個匹配,如果加入g,則替換所有匹配。(開頭的三道測試題能很好的說明這一點)

5)對於String對象的split方法,加上g與不加g是一樣的,即:
var sep=/user\d/;
var array=“user1dfsfuser2dfsf”.split(sep);
則array的值為{dfsf, dfsf}
此時sep=/user\d/g,返回值是一樣的。

6)對於String對象的search方法,加不加g也是一樣的。

總結2:附加參數m的用法

附加參數m,表明可以進行多行匹配,但是這個只有當使用^和$模式時才會起作用,在其他的模式中,加不加入m都可以進行多行匹配(其實說多行的字符串也是一個普通字符串),我們舉例說明這一點

1)使用^的例子
var regx=/^b./g;
var str=“bd76 dfsdf
sdfsdfs dffs
b76dsf sdfsdf”;
var rs=str.match(regx);
此時加入g和不加入g,都只返回第一個匹配{bd},如果regx=/^b./gm,則返回所有的匹配{bd,b7},注意如果regx=/^b./m,則也只返回第一個匹配。所以,加入m表明可以進行多行匹配,加入g表明可以進行全局匹配,綜合到一起就是可以進行多行全局匹配

2)使用其他模式的例子,例如
var regx=/user\d/;
var str=“sdfsfsdfsdf
sdfsuser3 dffs
b76dsf user6”;
var rs=str.match(regx);
此時不加參數g,則返回{user3},加入參數g返回{user3,user6},加不加入m對此沒有影響。

3)因此對於m我們要清楚它的使用,記住它只對^和$模式起作用,在這兩種模式中,m的作用為:如果不加入m,則只能在第一行進行匹配,如果加入m則可以在所有的行進行匹配。我們再看一個^的例子
var regx=/^b./;
var str=“ret76 dfsdf
bjfsdfs dffs
b76dsf sdfsdf”;
var rs=str.match(regx);
此時rs的值為null,如果加入g,rs的值仍然為null,如果加入m,則rs的值為{bj}(也就是說,在第一行沒有找到匹配,因為有參數m,所以可以繼續去下面的行去找是否有匹配),如果m和g都加上,則返回{bj,b7}(只加m不加g說明,可以去多行進行匹配,但是找到一個匹配后就返回,加入g表明將多行中所有的匹配返回,當然對於match方法是如此,對於exec呢,則需要執行多次才能依次返回)

總結3:在HTML的textarea輸入域中,按一個Enter鍵,對應的控制字符為“\r\n”,即“回車換行”,而不是“\n\r”,即“換行回車”,我們看一個前面我們舉過的例子:
var regx=/a\r\nbc/;
var str=“a
bc”;
var rs=regx.exec(str);
結果:匹配成功,rs的值為:{ },如果表達式為/a\n\rbc/,則不會被匹配,因此在一般的編輯器中一個”Enter”鍵代表着“回車換行”,而非“換行回車”,至少在textarea域中是這樣的。

 


RegExp 對象

RegExp 對象表示正則表達式,它是對字符串執行模式匹配的強大工具。

直接量語法

/pattern/attributes

創建 RegExp 對象的語法:

new RegExp(pattern, attributes);

參數

參數 pattern 是一個字符串,指定了正則表達式的模式或其他正則表達式。

參數 attributes 是一個可選的字符串,包含屬性 "g"、"i" 和 "m",分別用於指定全局匹配、區分大小寫的匹配和多行匹配。ECMAScript 標准化之前,不支持 m 屬性。如果pattern 是正則表達式,而不是字符串,則必須省略該參數。

返回值

一個新的 RegExp 對象,具有指定的模式和標志。如果參數 pattern 是正則表達式而不是字符串,那么 RegExp() 構造函數將用與指定的 RegExp 相同的模式和標志創建一個新的 RegExp 對象。

如果不用 new 運算符,而將 RegExp() 作為函數調用,那么它的行為與用 new 運算符調用時一樣,只是當 pattern 是正則表達式時,它只返回pattern,而不再創建一個新的 RegExp 對象。

拋出

SyntaxError - 如果 pattern 不是合法的正則表達式,或 attributes 含有 "g"、"i" 和 "m" 之外的字符,拋出該異常。

TypeError - 如果 pattern 是 RegExp 對象,但沒有省略 attributes 參數,拋出該異常。

修飾符

修飾符 描述
i 執行對大小寫不敏感的匹配。
g 執行全局匹配(查找所有匹配而非在找到第一個匹配后停止)。
m 執行多行匹配。

方括號

方括號用於查找某個范圍內的字符:

表達式 描述
[abc] 查找方括號之間的任何字符。
[^abc] 查找任何不在方括號之間的字符。
[0-9] 查找任何從 0 至 9 的數字。
[a-z] 查找任何從小寫 a 到小寫 z 的字符。
[A-Z] 查找任何從大寫 A 到大寫 Z 的字符。
[a-Z] 查找任何從小寫 a 到大寫 Z 的字符。
[adgk] 查找給定集合內的任何字符。
[^adgk] 查找給定集合外的任何字符。
[red|blue|green] 查找任何指定的選項。

元字符

元字符(Metacharacter)是擁有特殊含義的字符:

元字符 描述
. 查找單個字符,除了換行和行結束符。
\w 查找單詞字符。
\W 查找非單詞字符。
\d 查找數字。
\D 查找非數字字符。
\s 查找空白字符。
\S 查找非空白字符。
\b 查找位於單詞的開頭或結尾的匹配。
\B 查找不處在單詞的開頭或結尾的匹配。
\0 查找 NUL 字符。
\n 查找換行符。
\f 查找換頁符。
\r 查找回車符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八進制數 xxx 規定的字符。
\xdd 查找以十六進制數 dd 規定的字符。
\uxxxx 查找以十六進制數 xxxx 規定的 Unicode 字符。

量詞

量詞 描述
n+ 匹配任何包含至少一個 n 的字符串。
n* 匹配任何包含零個或多個 n 的字符串。
n? 匹配任何包含零個或一個 n 的字符串。
n{X} 匹配包含 X 個 n 的序列的字符串。
n{X,Y} 匹配包含 X 或 Y 個 n 的序列的字符串。
n{X,} 匹配包含至少 X 個 n 的序列的字符串。
n$ 匹配任何結尾為 n 的字符串。
^n 匹配任何開頭為 n 的字符串。
?=n 匹配任何其后緊接指定字符串 n 的字符串。
?!n 匹配任何其后沒有緊接指定字符串 n 的字符串。

RegExp 對象屬性

FF: Firefox, IE: Internet Explorer

屬性 描述 FF IE
global RegExp 對象是否具有標志 g。 1 4
ignoreCase RegExp 對象是否具有標志 i。 1 4
lastIndex 一個整數,標示開始下一次匹配的字符位置。 1 4
multiline RegExp 對象是否具有標志 m。 1 4
source 正則表達式的源文本。 1 4

RegExp 對象方法

FF: Firefox, IE: Internet Explorer

方法 描述 FF IE
compile 編譯正則表達式。 1 4
exec 檢索字符串中指定的值。返回找到的值,並確定其位置。 1 4
test 檢索字符串中指定的值。返回 true 或 false。 1 4

支持正則表達式的 String 對象的方法

FF: Firefox, IE: Internet Explorer

方法 描述 FF IE
search 檢索與正則表達式相匹配的值。 1 4
match 找到一個或多個正則表達式的匹配。 1 4
replace 替換與正則表達式匹配的子串。 1 4
split 把字符串分割為字符串數組。 1 4



正則的思想都是一樣的,但是具體的寫法會有所不同,在這里提到的/g,/i,/m在其他的地方也許就不能用了。

一,js正則標志/g,/i,/m說明

1,/g 表示該表達式將用來在輸入字符串中查找所有可能的匹配,返回的結果可以是多個。如果不加/g最多只會匹配一個

2,/i  表示匹配的時候不區分大小寫

3,/m 表示多行匹配,什么是多行匹配呢?就是匹配換行符兩端的潛在匹配。影響正則中的^$符號


二,實例說明

1,/g的用法


<script type="text/javascript">  
str = "tankZHang (231144)"+  
"tank ying (155445)";  
res = str.match(/tank/);    //沒有加/g  
alert(res);                 //顯示一個tank  
  
res = str.match(/tank/g);   //加了/g  
alert(res);                 //顯示為tank,tank  
<STRONG></script></STRONG>  


2,/i的用法


1.<script type="text/javascript">  
2.str = "tankZHang (231144)"+  
3. "tank ying (155445)";  
4.res = str.match(/zhang/);      
5.alert(res);                  //顯示為null  
6.  
7.res = str.match(/zhang/i);   //加了/i  
8.alert(res);                  //顯示為ZHang  
9.</script>  


3,/m的用法


<script type="text/javascript">  
var p = /$/mg;  
var s = '1\n2\n3\n4\n5\n6';  
alert(p.test(s));  //顯示為true  
alert(RegExp.rightContext.replace(/\x0A/g, '\\a'));  //顯示\a2\a3\a4\a5\a6  
alert(RegExp.leftContext);    //顯示為豎的2345  
alert(RegExp.rightContext);   //顯示為6  
  
var p = /$/g;  
var s = '1\n2\n3\n4\n5\n6';  
alert(p.test(s));  //顯示為true  
alert(RegExp.rightContext.replace(/\x0A/g, '\\a'));  //什么都不顯示  
alert(RegExp.leftContext);    //顯示為豎的123456  
alert(RegExp.rightContext);   //什么都不顯示  
  
var p = /^/mg;  
var s = '1\n2\n3\n4\n5\n6';  
alert(p.test(s));    //顯示為true  
alert(RegExp.rightContext.replace(/\x0A/g, '\\a')); //顯示為1\a2\a3\a4\a5\a6  
alert(RegExp.leftContext);     //顯示為豎的12345  
alert(RegExp.rightContext);    //顯示為6  
</script>    
  
//從上例中可以看出/m影響的^$的分割方式

上面說的三個例子,/i,/g,/m分開來說的,可以排列組合使用的。個人覺得/m沒有多大用處



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com