正則表達式:RegExp對象
正則表達式描述一個字符模式的對象,或者說用某種模式去匹配一類字符串的一個公式。
1.創建
可以用RegExp構造函數和直接量兩種方式。正則表達式直接量被包含在一對"/"中.


1 var partern1 = RegExp('\\d*'); 2 //等價于 3 var partern1 = /\d*/; 4 var partern2 = RegExp('^[1-9]*$'); 5 //等價于 6 var partern2 = /^[1-9]*$/;
?在創建正則表達式時可以為其制定一個標志,來說明高級匹配模式的規則。
當使用RegExp創建表達式對象時,需要指定的標志作為第二個參數傳入.
當使用直接量創建表達式對象時,直接在標識表達式的結束位置"/"寫上標志.
標志 | 含義 |
i | 執行匹配時忽略大小寫 |
g | 執行一個全局匹配,即找到所有匹配項, |
m | 多行匹配模式 |
?標志可以自由搭配使用..........?
var partern1 = RegExp('\\d*','g');//等價于var partern1 = /\d*/g;var partern2 = RegExp('^\\S$','i');//等價于var partern2 = /^\S$/i;var partern3 = RegExp('^\\w$', 'ig');//等價于var partern3 = /^\w$/ig;
2.語法規則:
1.正則表達式由字符直接量,元符號和各種轉義序列組成。
字符直接量:匹配它本身。
除了字母字符和數字外,可以通過"\"開頭的轉義序列支持非字母字符。
直接量字符 | ?匹配 |
字母或數字字符 | 自身 |
\o | NUL字符 |
? \t | 水平制表符? |
?\v | ? 垂直制表符 |
?\n | ? 換行符 |
?\r | ? 回車符 |
?\f | ? 換頁符 |
?\xnn | ? 由十六進制nn指定的拉丁字符 |
?\uxxxx | ? 由十六進制xxxx指定的Unicode字符 |
?\cx | ? 控制字符x |
? 在“[]”內放入單獨的直接量組成字符類,一個字符類可以和它所包含的任何單個字符相匹配eg:[abc] 匹配:“a”,“b”,“c”
字符類 | 匹配 |
[...] | 括號內包含的任意字符 |
[^...] | 括號內不包含的任意字符 |
. | 除換行符和其他Unicode行中字符之外的其它字符 |
\w | 大小寫字母,數字,下劃線 |
\W | 非大小寫字母,數字,下劃線 |
\s | 空白字符 |
\S | 非空白字符 |
\d | 數字字符 |
\D | 非數字字符 |
? eg:/\d\d/ : 兩位數字。? /[bB]ug/ : bug,Bug.? /a.b/ : abb,?anb~ 等 。 /[^0-9]/ : 任何單個非數字。
?
上面給的是單位字符,下面給出多位字符
符號 | 含義 |
{m,n} | 匹配前一項最少m次,最多n次 |
{m,} | 匹配前一項最少m次 |
{m} | 匹配前一項m次 |
? | 匹配前一項0次或者1次 |
+ | 匹配前一項最少1次 =>{1,} |
* | 匹配前一項0次或多次,=>{0,} |
? eg: /\d{1,3}/ : 匹配1~3位數字。 /a{3}/ : 匹配aaa.? /a?/ : 匹配‘’和‘a'
注意:在重復匹配時正則會盡可能多的匹配更多的字符:貪婪匹配。如果在表達式后面加上元符號“?”就會進行費貪婪匹配,匹配盡可能少的字符。
eg: /a+/匹配’aaaab' 時會匹配前四位a ,?? /a+?/則只會匹配第一位a
?
正則表達式還可以指定選擇項,為表達式分組和引用前面子表達式所匹配的字符。
符號 | 含義 |
| | 選擇,匹配符號左邊的子表達式或者右邊的子表達式。 |
(...) | 組合,將幾個項目組合為一個單元,這個單元可以被重復字符所使用,還可以被引用。 |
(?:...) | 只組合,為一個單元,但不能被引用 |
\n | n是一個數字,表示:表達式中第n個可以被引用的組合,從左到右按書寫順序排序。 \n 匹配與其所引用的分組匹配字符一樣的字符 |
eg:/a|b/ : 'a','b'? . /(a|b)B\1/ :aBa,bBb .?? /(?:m+)(a|b)B\1/ : \1匹配a|b而不是m+
?
? 正則表達式還有一些字符和轉義序列匹配的是字符串中的特定位置?? : 錨字符
字符 | 含義 |
^ | 匹配字符串的開頭。在多行匹配模式中,匹配一行的開頭。 |
$ | 匹配字符串的結尾。在多行匹配模式中,匹配一行的結尾 |
\b | 參考:http://www.w3school.com.cn/js/jsref_regexp_begin.asp 匹配一個詞語(單詞)的邊界 \b 元字符匹配單詞邊界。 在單詞邊界匹配的位置,單詞字符后面或前面不與另一個單詞字符直接相鄰。請注意,匹配的單詞邊界并不包含在匹配中。換句話說,匹配的單詞邊界的長度為零。(不要與 [\b] 混淆。) 如果未找到匹配,則返回 null 提示:\b 元字符通常用于查找位于單詞的開頭或結尾的匹配。 |
\B | 匹配所有非詞語(單詞)邊界的字符 |
? ? (?:p) | 正前向匹配,要求接下來的字符與模式p匹配,但匹配的結果不包含p匹配的字符。 |
(?!p) | 反前向匹配,要求接下來的字符不與模式p匹配 |
?? eg: /^Bugs/ : 匹配Bugs Bug,不匹配Bug Bug . /s$/ : 匹配 Bug Bugs 不匹配Bugs Bug .
/^Bugs Bug$/ : 匹配Bugs Bug,不匹配Bug Bug .?
/\bm/ 匹配 "moon" 中的 'm';
/oo\b/ 不匹配 "moon" 中的 'oo',因為 'oo' 后面的 'n' 是一個單詞字符;
/oon\b/ 匹配 "moon" 中的 'oon',因為 'oon' 位于字符串的末端,后面沒有單詞字符;
/\w\b\w/ 不匹配任何字符,因為單詞字符之后絕不會同時緊跟著非單詞字符和單詞字符。
<script type="text/javascript">var str = "Bugs Bug";var patt1 = /\bBug/g;document.write(str.match(patt1));//Bug,Bug
</script>
/Bugs(?: Bug)/ : 匹配Bugs Bug 不匹配BugsBug?
注意:如果想匹配元符號或者具有特殊含義的符號時,只需要在相應的字符前面加上轉義符反斜線“\”即可。
?
3. 正則表達式的屬性
source :是一個只讀的字符串,存放正則表達式的文本。
<script type="text/javascript">var str = "Bugs Bug";var reg = new RegExp('^(Bugs Bug){0,}$', 'igm');var test = reg.source;alert(test); //^(Bugs Bug){0,}$ </script>
global : 是一個只讀的布爾屬性,表示:正則表達式是否啟用了全局匹配模式。
<script type="text/javascript">var str = "Bugs Bug";var reg = new RegExp('^(Bugs Bug){0,}$', 'igm');var reg1 = new RegExp('^(Bugs Bug){0,}$', 'm');alert(reg1.global);//falsealert(reg.global);//true</script>
ignoreCase : 同global類似,只讀的布爾值,表示正則表達式是否啟用了忽略大小寫的模式。
? multiline :? 只讀屬性,表示正則表達式是否啟用了多行匹配的模式。
? lastIndex : 是一個可讀可寫的整數,記錄了在全局匹配模式下,在字符串中下一次開始匹配的位置,
?
?4.用于匹配模式的String方法
replace方法 :
var str = "Bugs&Bug"; var reg3 = new RegExp('&', 'g');alert(str.replace(reg3,' '));//Bugs Bug
search方法 : 以正則表達式為參數,返回第一個與之匹配的子字符的開始位置,如果沒有任何子字符與之匹配返回-1.
<script type="text/javascript">var str = "I Love Bugs Bug";var reg = new RegExp('B.*s', 'igm');//匹配Bugsalert(str.search(reg)); //7alert(str.search(/.(?:Bug)/));//6 //匹配Bugs前面的空格</script>
注意:如果參數不是正則表達式,則參數會被傳遞給RegExp的構造函數,變為正則表達式,同時,search并不支持全局匹配模式,總是返回找到的第一個子字符的位置.
?在replace方法的第二個參數中,可以使用符號“$”加數字來引用這些分組所匹配的內容。
<script type="text/javascript">var str = 'my name is?Bugs Bug';var regstr =str.replace(/^.*\?([a-zA-Z]+.*)+$/i, 'my name is:"$1"');alert(regstr); //my name is:"Bugs Bug"</script>
方法match接受一個正則表達式作為參數(如果不是正則表達式,會轉換成正則表達式) 返回一個包含匹配結果的數組,數組的第一個元素是匹配的子字符串,
從第二個元素開始,是正則表達式的分組所匹配的內容,如果正則表達式被設置成了全局匹配模式,則返回的數組就是字符串中所有匹配的子字符串,
<script type="text/javascript">function test() {var str = "my name is?Bugs Bug";var strreg = str.match(/^.*\?(([a-rA-Rt-zT-Z]*).*([a-zA-z]*))$/);alert(strreg); //my name is?Bugs Bug,Bugs Bug,Bug,var strreg2 = str.match(/^.*\?([a-rA-Rt-zT-Z]*).*([a-zA-z])*$/g);alert(strreg2); //my name is?Bugs Bug }test();</script>
如果match作用于一個非全局模式的正則表達式,則返回的數組會有兩個額外的
屬性 :index:包含所匹配的字符串在源字符串中的位置,
input:保存了源字符串的一個副本。
alert(strreg.index);//0alert(strreg.input); //my name is?Bugs Bug }test();
split方法,有一個接受正則表達式的參數
<script type="text/javascript">function test() {var str = "my|name\\is?Bugs Bug";alert(str.split(/\||\\|\?| /));//my,name,is,Bugs,Bug}test();</script>
?
?RegExp定義了兩個用于模式匹配的方法,他們的行為和前面介紹的String方法,類似。第一個是exec方法,和match方法相似,只是它接受一個字符串的參數,在此字符串中進行匹配查找,返回一個數組,與match方法不同的是:無論正則表達式是否開啟了全局匹配模式,exec方法每次只匹配一個結果,返回數組的第一個元素是匹配的子字符串,從第二個元素開始是正則表達式中各個分組所匹配的內容,
只是當正則表達式開啟了全局匹配模式時,每次成功匹配后,正則表達式的lastIndex屬性都會被改寫以標識此次匹配的子字符串的位置,在下一次執行exec方法進行匹配時,會從lastIndex屬性標識的位置開始查找,當沒有任何匹配時,lastindex屬性會被重置為0,并返回null,這個特性使程序員反復匹配一個字符串從而得到所有匹配的子字符串的所有信息。
<script type="text/javascript">function test() {var str = "my|name\\is?Bugs Bug";var reg = /(Bugs) (Bug)/g;var a;while ((a = reg.exec(str)) != null) {document.write(a.join(' ') + '<br/>'); //Bugs Bug Bugs Bug }var str = "a=1&b=2+c=3|d=4@e=5%f=6";var reg = /([a-z])=([0-9])/g;var a;while ((a = reg.exec(str)) != null) {document.write(a.join(' ') + '<br/>');/* a=1 a 1b=2 b 2c=3 c 3d=4 d 4e=5 e 5f=6 f 6*/}}test();</script>
另一個方法是test,接受一個字符串作為參數,然后進行匹配檢測,如果字符串能夠進行匹配,則返回true,否則false,
<script type="text/javascript">function test() { var reg = /([A-Za-z])/;alert(reg.test("Bugs Bug"));//truealert(reg.test("123"));//false }test();</script>
常用的正則表達式:(未驗證)
中文字符 | [\u4e00-\u9fa5] |
雙字節字符(包括漢字) | [^\x00-\xff] |
E-mail地址 | /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/i |
HTML標記 | /<(.*)>.*<\/\1>|<(.*)\/>/ |
URL 地址 | /^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$/i |
字符串首尾的空格 | /(^\s*)|(\s*$)/ |
顏色代碼 | /\#[a-fA-F0-9]{6}/ |
身份證號碼 | /^\d{15}(\d{2}[xX0-9])?$/ |
電話號碼 | /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/ |
整數 | /^(\+|\-)?[1-9]\d*$/ |
浮點數 | /^(\+|\-)?(0|[1-9][0-9]*)(\.[0-9]*[1-9])?$/ |