首頁  >  文章  >  web前端  >  分享正規表示式一些常用的例子

分享正規表示式一些常用的例子

零下一度
零下一度原創
2017-06-28 10:59:271092瀏覽

正規表示法常用總結

正規表示式,又稱正規表示法、常規表示法。 (英文: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]

   

4 replace() :尋找符合正規則的字串,就替換成對應的字串。返回替換後的內容。

用法: 字串.replace(正規,新的字串/回呼函數)(在回呼函數中,第一個參數指的是每次符合成功的字元)

| : 或的意思。

例子:敏感词过滤,比如 我爱北京天安门,天安门上太阳升。------我爱*****,****上太阳升。即北京和天安门变成*号,

一开始我们可能会想到这样的方法:


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标签 比如

hahahah
找出标签

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,例如

,
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn