很長時間沒看 Regex了,碰巧今天用到,溫故知新了一把 看書學習吧。
原來在無憂發過初學者正則,現在補充了分組提供了下載 完善下。
一 javascriptRegex的基本知識
1 javascript 正則對象建立 和用法
聲明javascript Regex
var reCat = new RegExp("cat");
你也可以
var reCat = /cat/; //Perl 風格 (推薦)
2 學習最常用的 test exec match search replace split 6個方法
1) test 檢查指定的字串是否存在
var data = "123123";
var reCat = /123/gi;
alert(reCat.test(data)); //true
//檢查字元是否存在 g 繼續往下走 i 不區分大小寫
2) exec 返回查詢值
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = /cat/i;
alert(reCat.exec(data)); //Cat
3)match 得到查詢數組
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = /cat/gi;
var arrMactches = data.match(reCat)
for (var i=0;i < arrMactches.length ; i++)
{
alert(arrMactches[i]); //Cat cat
}
4) search 返回搜尋位置 類似於indexof
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = /cat/gi;
alert(data.search(reCat)); //23
5) replace 替換字元 利用正則替換
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = /cat/gi;
alert(data.replace(reCat,"libinqq"));
6)split 利用正則分割數組
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = /\,/;
var arrdata = data.split(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]);
}
3 學習下 簡單類 負向類 範圍類 組合類別
//簡單類
var data = "1libinqq,2libinqq,3libinqq,4libinqq";
var reCat = /[123]libinqq/gi;
var arrdata = data.match(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]); // 1libinqq 2libinqq 3libinqq
}
//負向類
var data = "alibinqq,1libinqq,2libinqq,3libinqq,4libinqq"; //\u0062cf
var reCat = /[^a123]libinqq/gi;
var arrdata = data.match(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]); //4libinqq
}
//範圍類
var data = "libinqq1,libinqq2,libinqq3,libinqq4,libinqq5"; //\u0062cf
var reCat = /libinqq[2-3]/gi;
var arrdata = data.match(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]); // libinqq2 libinqq3
}
//組合類別
var data = "a,b,c,w,1,2,3,5"; //\u0062cf
var reCat = /[a-q1-4\n]/gi;
var arrdata = data.match(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]); // a b c 1 2 3
}
這些都是 js正則 最基本的使用方法,看不會的請複製到筆記本練習下,看會了再往下面看。
二 javascript Regex是分組知識
1) 簡單分組
<script language="JavaScript"><br /><!--<br />/*Regex 簡單的分組<br />舉例 我們要尋找字串 MouseMouse<br />var reCat = /MouseMouse/gi;<br />儘管這是可以的,但是有點浪費。如果不知道Mouse 在字串中到底出現幾次時該怎麼辦,如果重複多次呢。<br />var reCat = /(mouse){2}/gi; 括弧的意思列Mouse 將在一行連續出現2次。<br />*/<br />var data = "Ah-mousemouse";<br />var reCat = /(mouse){2}/gi;<br />var arrdata = data.match(reCat);<br />for (var i = 0; i < arrdata.length; i++)<br />{<br />alert(arrdata[i]);<br />}<br />//--><br /></script>
提示:您可以先修改部分代碼再運行
2 複雜分組
<script language="JavaScript"><br /><!--<br />/*Regex 複雜的分組<br />? 零次 或 一次<br />* 零次 或 多次<br />+ 最少一次 或 多次<br />*/<br />var data = "bb ba da bad dad aa ";<br />var reCat = /([bd]ad?)/gi; // 匹配出 ba da bad dad<br />var arrdata = data.match(reCat);<br />for (var i = 0; i < arrdata.length; i++)<br />{<br />alert(arrdata[i]);<br />}<br />// 同時 也不介意將分組放在分組中間<br />// var re = /(mom( and dad)?)/; 匹配出 mom 或 mon and daa<br />//--><br /></script>
提示:您可以先修改部分代碼再運行
3 反向引用
<script language="JavaScript"><br /><!--<br />/*Regex 反向引用*/<br />var sToMatch = "#123456789";<br />var reNumbers = /#(\d+)/;<br />reNumbers.test(sToMatch);<br />alert(RegExp.$1);<br />/*<br />這個例子嘗試匹配後面跟著幾個或多個數位鎊符合,並對數字進行分組<br />以儲存他們。在調用 test 方法後,所有的反向引用都儲存到了 RegExp 建構函式中<br />從 RegExp.$1(它儲存了第一個反向引用)開始,如果還有第二個反向引用,就是<br />RegExp.$2,如果還有第三個反向引用存在,就是 RegExp.$3.依此類推。因為該組<br />匹配了 “123456780”,所以 RegExp.$1 中就儲存了這個字串。<br />*/<br />var sToChange = "1234 5678";<br />var reMatch = /(\d{4}) (\d{4})/;<br />var sNew = sToChange.replace(reMatch,"$2 $1");<br />alert(sNew);<br />/*<br />在這個例子中,Regex有兩個分組,每一個分組有四個數字。在 replace() 方法的第二個參數<br />中,$2 等同於 “5678” ,而 $1 等同於 “1234”,對應於它們在運算式中的出現順序。<br />*/<br />//--><br /></script>
提示:您可以先修改部分代碼再運行
4 候選
<script language="JavaScript"><br /><!--<br />/*Regex 候選 */<br />var sToMatch1 = "red";<br />var sToMatch2 = "black";<br />var reRed = /red/;<br />var reBlack = /black/;<br />alert(reRed.test(sToMatch1) || reBlack.test(sToMatch1));<br />alert(reRed.test(sToMatch2) || reBlack.test(sToMatch2));<br />/*<br />這雖然能完成任務,但是十分沉長,還有另一種方式就是Regex的候選操作符。<br />*/<br />var sToMatch1 = "red";<br />var sToMatch2 = "black";<br />var reRedOrBlack = /(red|black)/;<br />alert(reRedOrBlack.test(sToMatch1));<br />alert(reRedOrBlack.test(sToMatch2));<br />//--><br /></script>
提示:您可以先修改部分代碼再運行
5 非捕獲性分組
<script language="JavaScript"><br /><!--<br />/*Regex 非捕獲性分組<br />如果要建立一個非捕獲性分組,只要在左括弧的後面加上一個問號和一個緊跟的冒號:<br />*/<br />var sToMatch = "#123456789";<br />var reNumbers = /#(?:\d+)/;<br />reNumbers.test(sToMatch);<br />alert(RegExp.$1);<br />/*<br />這個例子的最後一行代碼輸出一個Null 字元串,因為該組是非捕獲性的,<br />*/<br />var sToMatch = "#123456789";<br />var reNumbers = /#(?:\d+)/;<br />alert(sToMatch.replace(reNumbers,"abcd$1"));<br />/*<br />正因如此,replace()方法就不能通過 RegExp.$x 變數來使用任何反向引用,這段代碼<br />輸出的“abcd$1”而不是abcd123456789, 因為$1 在這裡並不被看成是一個反向引用。<br />*/<br />//--><br /></script>
提示:您可以先修改部分代碼再運行
6 前瞻
<script language="JavaScript"><br /><!--<br />/*Regex 前瞻<br />前瞻 就和它名字一樣,它告訴Regex運算器向前看一些字元而不是移動位置<br />*/<br />var sToMatch1 = "bedroom";<br />var sToMatch2 = "bedding";<br />var reBed = /bed(?=room)/;<br />alert(reBed.test(sToMatch1)); //true<br />alert(reBed.test(sToMatch2)); //false<br />//負向前瞻<br />var sToMatch1 = "bedroom";<br />var sToMatch2 = "bedding";<br />var reBed = /bed(?!room)/;<br />alert(reBed.test(sToMatch1)); //false<br />alert(reBed.test(sToMatch2)); //true<br />//--><br /></script>
提示:您可以先修改部分代碼再運行
7 邊界
<script language="JavaScript"><br /><!--<br />/*Regex 邊界<br />^ 行開頭<br />$ 行結尾<br />\b 單詞的邊界<br />\B 非單詞的邊界<br />*/<br />var sToMatch = "Important word is the last one.";<br />var reLastWord = /(\w+)\.$/;<br />reLastWord.test(sToMatch);<br />alert(RegExp.$1); //one<br />/*<br />假如想尋找一個單詞,但要它只出現在行尾,則可以使用貨幣符號 ($)來表示它:<br />*/<br />var sToMatch = "Important word is the last one.";<br />var reLastWord = /^(\w+)/;<br />reLastWord.test(sToMatch);<br />alert(RegExp.$1); //Important<br />/*<br />在這個例子中,Regex尋找行起始位置後的一個或多個單詞字元。如果遇到非單詞字元<br />匹配停止,返回 Important。 這個例子也可以用單詞邊界實現。<br />*/<br />var sToMatch = "Important word is the last one.";<br />var reLastWord = /^(.+?)\b/;<br />reLastWord.test(sToMatch);<br />alert(RegExp.$1); //Important<br />/*<br />這裡,Regex用惰性量詞來制定在單詞邊界之前可以出現任何字元,且可以出現一次或<br />多次(如果使用貪婪性量詞,運算式就匹配整個字串)。<br />*/<br />var data = " First second thind fourth fifth sixth ";<br />var reCat = /\b(\S+?)\b/g;<br />var arrdata = data.match(reCat);<br />for (var i = 0; i < arrdata.length; i++)<br />{<br />alert(arrdata[i]);<br />}<br />/*<br />使用單詞邊界可以方便地從字串中抽取單詞。<br />*/<br />//--><br /></script>
提示:您可以先修改部分代碼再運行
8 多行模式
<script language="JavaScript"><br /><!--<br />/*Regex 多行模式<br />要制定多行模式,只要在Regex想要匹配的行末的一個單詞<br />*/<br />var data = " First second\n thind fourth\n fifth sixth";<br />var reCat = /(\w+)$/g;<br />var arrdata = data.match(reCat);<br />for (var i = 0; i < arrdata.length; i++)<br />{<br />alert(arrdata[i]);<br />}<br />/*<br />上面只返回一個單詞 sixth,因為分行符號阻擋了匹配,只能匹配行末的一個單詞,<br />當然也可以使用 split() 方法將字串分割成數組,但就得對每一行進行單獨匹配。<br />以前不好好看書經常半吊子,看一半就仍了,導致用了好多 split, 其實很簡單如下面<br />例子 只需要 m 參數進行多行匹配。<br />*/<br />var data = " First second\n thind fourth\n fifth sixth";<br />var reCat = /(\w+)$/gm;<br />var arrdata = data.match(reCat);<br />for (var i = 0; i < arrdata.length; i++)<br />{<br />alert(arrdata[i]);<br />}<br />//--><br /></script>
提示:您可以先修改部分代碼再運行
至此結束,這些都是 javascript Regex的基本方法,如果你看會了看複雜的正則你會有豁然開朗的感覺。
另外 我知道有些人很懶(包括我),所以正則分組的例子的我特此打包歡迎下載學習 js正則分組