正規表示法常用總結
正規表示式,又稱正規表示法、常規表示法。 (英文:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正規表示式使用單一字串來描述、匹配一系列符合某個句法規則。在許多文字編輯器裡,正規表示式通常被用來檢索、取代那些符合某個模式的文字。
正規表示式,有木有人像我一樣,學了好幾遍卻還是很懵圈,學的時候老明白了,學完了忘光了。好吧,其實還是練的不夠,所謂溫故而知新,可以為師矣,今天就隨我來複習一下這傲嬌的正則表達式吧。
為啥要有正規表示式呢?其實就是因為計算機笨(這話不是我說的),比如123456@qq.com,我們一看就是郵箱,可是計算機不認識啊,所以我們就要用一些計算機認識的語言,來製定好規則,告訴它符合這個規則的就是個信箱,這樣計算機就能幫我們找到對應的東西了。所以正則就是用來設定規則,來完成我們需求的一些操作的,比如登入驗證啦,搜尋指定的東西啦等等,說太多都是多餘,直接看正題吧。
定義正規:
#1 var re = new RegExp(“a”); //RegExp物件。參數就是我們想要訂定的規則。有一種情況必須用這種方式,下面會提到。
2 var re = /a/; // 簡寫方法建議使用效能較好不能為空不然以為是註釋,
正則常用的方法
1 test() :在字串中找出符合正規則的內容,若查找到回傳true,反之回傳false.
用法:正規.test(字串)
範例:判斷是否為數字
var str = '374829348791';
#var re = /\ D/; // \D代表非數字
if( re.test(str) ){ // 回傳true,代表在字串中找到了非數字。
alert('不全數是數字');
}else{
#alert('全是數字');
}
正規表示式中有很多符號,代表不同的意思,用來讓我們去定義不同的規則,例如上面\D,還有下面的這些:
\s : 空格
\S : 非空格
\d : 數字
\D : 非數字
\w :字符( 字母,數字,底線_ )
\W : 非字符例子:是否有不是數字的字符
(下面會根據例子,依次講一些常用的字符,最後再作總結。字母的位置), 如果搜尋失敗就回傳-1
用法:字串.search(正規)
在字串中尋找複合正規則的內容。忽略大小寫:i——ignore(正規中預設是區分大小寫的如果不區分大小寫的話,在正規的最後加標識i )
範例:在字串中找字母b,且不區分大小寫
var str = 'abcdef';
var re = /B/i;
// var re = new RegExp('B','i'); 也可以這樣寫
alert( str.search(re) ); // 1
3 match() 在字串中搜尋複合規則的內容,搜尋成功就回傳內容,格式為數組,失敗就回傳null。
用法: 字串.match(正規)
量詞:+ 至少出現一次符合不確定的次數(符合就是搜尋尋找的意思)
全域符合:g ——global(正規中默認,只要搜尋到複合規則的內容就會結束搜尋)
範例:找出指定格式的所有數字,如下找到123,54,33,879
#var str = 'haj123sdk54hask33dkhalsd879';
##var re = /\d+/g; // 每次符合至少一個數字且全域匹配如果不是全域匹配,當找到數字123,它就會停止了。就只會彈出123.加上全域匹配,就會從開始到結束一直去搜尋符合規則的。如果沒有加號,配對的結果就是1,2,3,5,4,3,3,879不是我們想要的,有了加號,每次配對的數字就是至少一個了。
alert( str.match(re) ); // [123,54,33,879]
例子:敏感词过滤,比如 我爱北京天安门,天安门上太阳升。------我爱*****,****上太阳升。即北京和天安门变成*号,
一开始我们可能会想到这样的方法:
var str = "我爱北京天安门,天安门上太阳升。";
var re = /北京|天安门/g; // 找到北京 或者天安门 全局匹配
var str2 = str.replace(re,'*');
alert(str2) //我爱**,*上太阳升
//这种只是把找到的变成了一个*,并不能几个字就对应几个*。
要想实现几个字对应几个*,我们可以用回调函数实现:
var str = "我爱北京天安门,天安门上太阳升。";
var re = /北京|天安门/g; // 找到北京 或者天安门 全局匹配
var str2 = str.replace(re,function(str){
alert(str); //用来测试:函数的第一个参数代表每次搜索到的符合正则的字符,所以第一次str指的是北京 第二次str是天安门 第三次str是天安门
var result = '';
for(var i=0;i result += '*'; } return result; //所以搜索到了几个字就返回几个* }); alert(str2) //我爱*****,***上太阳升 //整个过程就是,找到北京,替换成了两个*,找到天安门替换成了3个*,找到天安门替换成3个*。 replace是一个很有用的方法,经常会用到。 正则中的字符 ():,小括号,叫做分组符。就相当于数学里面的括号。如下: var str = '2013-6-7'; var re1 = /\d-+/g; // 全局匹配数字,横杠,横杠数量至少为1,匹配结果为: 3- 6- var re1 = /(\d-)+/g; // 全局匹配数字,横杠,数字和横杠整体数量至少为1 3-6- var re2 = /(\d+)(-)/g; // 全局匹配至少一个数字,匹配一个横杠 匹配结果:2013- 6- 同时,正则中的每一个带小括号的项,都叫做这个正则的子项。子项在某些时候非常的有用,比如我们来看一个栗子。 例子:让2013-6-7 变成 2013.6.7 var str = '2013-6-7'; var re = /(\d+)(-)/g; str = str.replace(re,function($0,$1,$2){ //replace()中如果有子项, //第一个参数:$0(匹配成功后的整体结果 2013- 6-), // 第二个参数 : $1(匹配成功的第一个分组,这里指的是\d 2013, 6) //第三个参数 : $1(匹配成功的第二个分组,这里指的是- - - ) return $1 + '.'; //分别返回2013. 6. }); alert( str ); //2013.6.7 //整个过程就是利用子项把2013- 6- 分别替换成了2013. 6. 最终弹出2013.6.7 match方法也会返回自己的子项,如下: var str = 'abc'; var re = /(a)(b)(c)/; alert( str.match(re) ); //[abc,a,b,c]( 返回的是匹配结果 以及每个子项 当match不加g的时候才可以获取到子项的集合) [] : 表示某个集合中的任意一个,比如 [abc] 整体代表一个字符 匹配 a b c 中的任意一个,也可以是范围,[0-9] 范围必须从小到大 。 [^a] 整体代表一个字符 :^写在[]里面的话,就代表排除的意思 例子:匹配HTML标签 比如
var re = /<[^>]+>/g; //符合左括號中間至少一個非右括號的內容(因為標籤裡面還有屬性等一些東西),然後匹配右括號var re = /<[\w\W]+>/g; //匹配左括號中間至少一個字元或非字元的內容,然後匹配右括號// 其實就是找到左括號,然後中間可以有至少一個內容,一直到找到右括號就代表是一個標籤。
轉義字元
\s : 空格
\S : 非空格
\d : 數字
\D : 非數字
\w : 字元( 字母,數字,底線_ )
#\W : 非字元
. :任意字元
#\. : 真正的點
\b : 獨立的部分( 起始,結束,空格)
#\B : 非獨立的部分
關於最後兩個來看個栗子:
var str = 'onetwo';
var str2 ="one two";
var re = /one\b/; // e後面必須是獨立的可以是起始,空格,或結束
alert( re.test(str) ); //false
alert ( re.test(str2) );//true
#範例:寫一個用class名稱取得節點的函數:
我們之前可能看過這樣的函數:
function getByClass(parent,classname){
if(parent.getElementsByClassName){
return parent.getElementsByClassName(classname);
}
else{
var results = new Array();//用來儲存所有取到的class為box的元素
var elems = parent.getElementsByTagName("*");
for(var i =0;i #if(elems[i].className==classname){ results.push(elems[i]); } } #return results; } } 其實這是有問題的,例如它如果一個標籤裡面有兩個class,或存在相同名字的class,例如