二 javascript Regex是分組知識
1) 簡單分組
<script language="JavaScript">
<!--
/*Regex 簡單的分組
舉例 我們要尋找字串 MouseMouse
var reCat = /MouseMouse/gi;
儘管這是可以的,但是有點浪費。如果不知道Mouse 在字串中到底出現幾次時該怎麼辦,如果重複多次呢。
var reCat = /(mouse){2}/gi; 括弧的意思列Mouse 將在一行連續出現2次。
*/
var data = "Ah-mousemouse";
var reCat = /(mouse){2}/gi;
var arrdata = data.match(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]);
}
//-->
</script>
2 複雜分組
<script language="JavaScript">
<!--
/*Regex 複雜的分組
? 零次 或 一次
* 零次 或 多次
+ 最少一次 或 多次
*/
var data = "bb ba da bad dad aa ";
var reCat = /([bd]ad?)/gi; // 匹配出 ba da bad dad
var arrdata = data.match(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]);
}
// 同時 也不介意將分組放在分組中間
// var re = /(mom( and dad)?)/; 匹配出 mom 或 mon and daa
//-->
</script>
3 反向引用
<script language="JavaScript">
<!--
/*Regex 反向引用*/
var sToMatch = "#123456789";
var reNumbers = /#(/d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1);
/*
這個例子嘗試匹配後面跟著幾個或多個數位鎊符合,並對數字進行分組
以儲存他們。在調用 test 方法後,所有的反向引用都儲存到了 RegExp 建構函式中
從 RegExp.$1(它儲存了第一個反向引用)開始,如果還有第二個反向引用,就是
RegExp.$2,如果還有第三個反向引用存在,就是 RegExp.$3.依此類推。因為該組
匹配了 “123456780”,所以 RegExp.$1 中就儲存了這個字串。
*/
var sToChange = "1234 5678";
var reMatch = /(/d{4}) (/d{4})/;
var sNew = sToChange.replace(reMatch,"$2 $1");
alert(sNew);
/*
在這個例子中,Regex有兩個分組,每一個分組有四個數字。在 replace() 方法的第二個參數
中,$2 等同於 “5678” ,而 $1 等同於 “1234”,對應於它們在運算式中的出現順序。
*/
//-->
</script>
4 候選
<script language="JavaScript">
<!--
/*Regex 候選 */
var sToMatch1 = "red";
var sToMatch2 = "black";
var reRed = /red/;
var reBlack = /black/;
alert(reRed.test(sToMatch1) || reBlack.test(sToMatch1));
alert(reRed.test(sToMatch2) || reBlack.test(sToMatch2));
/*
這雖然能完成任務,但是十分沉長,還有另一種方式就是Regex的候選操作符。
*/
var sToMatch1 = "red";
var sToMatch2 = "black";
var reRedOrBlack = /(red|black)/;
alert(reRedOrBlack.test(sToMatch1));
alert(reRedOrBlack.test(sToMatch2));
//-->
</script>
5 非捕獲性分組
<script language="JavaScript">
<!--
/*Regex 非捕獲性分組
如果要建立一個非捕獲性分組,只要在左括弧的後面加上一個問號和一個緊跟的冒號:
*/
var sToMatch = "#123456789";
var reNumbers = /#(?:/d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1);
/*
這個例子的最後一行代碼輸出一個Null 字元串,因為該組是非捕獲性的,
*/
var sToMatch = "#123456789";
var reNumbers = /#(?:/d+)/;
alert(sToMatch.replace(reNumbers,"abcd$1"));
/*
正因如此,replace()方法就不能通過 RegExp.$x 變數來使用任何反向引用,這段代碼
輸出的“abcd$1”而不是abcd123456789, 因為$1 在這裡並不被看成是一個反向引用。
*/
//-->
</script>
6 前瞻
<script language="JavaScript">
<!--
/*Regex 前瞻
前瞻 就和它名字一樣,它告訴Regex運算器向前看一些字元而不是移動位置
*/
var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /bed(?=room)/;
alert(reBed.test(sToMatch1)); //true
alert(reBed.test(sToMatch2)); //false
//負向前瞻
var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /bed(?!room)/;
alert(reBed.test(sToMatch1)); //false
alert(reBed.test(sToMatch2)); //true
//-->
</script>
7 邊界
<script language="JavaScript">
<!--
/*Regex 邊界
^ 行開頭
$ 行結尾
/b 單詞的邊界
/B 非單詞的邊界
*/
var sToMatch = "Important word is the last one.";
var reLastWord = /(/w+)/.$/;
reLastWord.test(sToMatch);
alert(RegExp.$1); //one
/*
假如想尋找一個單詞,但要它只出現在行尾,則可以使用貨幣符號 ($)來表示它:
*/
var sToMatch = "Important word is the last one.";
var reLastWord = /^(/w+)/;
reLastWord.test(sToMatch);
alert(RegExp.$1); //Important
/*
在這個例子中,Regex尋找行起始位置後的一個或多個單詞字元。如果遇到非單詞字元
匹配停止,返回 Important。 這個例子也可以用單詞邊界實現。
*/
var sToMatch = "Important word is the last one.";
var reLastWord = /^(.+?)/b/;
reLastWord.test(sToMatch);
alert(RegExp.$1); //Important
/*
這裡,Regex用惰性量詞來制定在單詞邊界之前可以出現任何字元,且可以出現一次或
多次(如果使用貪婪性量詞,運算式就匹配整個字串)。
*/
var data = " First second thind fourth fifth sixth ";
var reCat = //b(/S+?)/b/g;
var arrdata = data.match(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]);
}
/*
使用單詞邊界可以方便地從字串中抽取單詞。
*/
//-->
</script>
8 多行模式
<script language="JavaScript">
<!--
/*Regex 多行模式
要制定多行模式,只要在Regex想要匹配的行末的一個單詞
*/
var data = " First second/n thind fourth/n fifth sixth";
var reCat = /(/w+)$/g;
var arrdata = data.match(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]);
}
/*
上面只返回一個單詞 sixth,因為分行符號阻擋了匹配,只能匹配行末的一個單詞,
當然也可以使用 split() 方法將字串分割成數組,但就得對每一行進行單獨匹配。
以前不好好看書經常半吊子,看一半就仍了,導致用了好多 split, 其實很簡單如下面
例子 只需要 m 參數進行多行匹配。
*/
var data = " First second/n thind fourth/n fifth sixth";
var reCat = /(/w+)$/gm;
var arrdata = data.match(reCat);
for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]);
}
//-->
</script>
至此結束,這些都是 javascript Regex的基本方法,如果你看會了看複雜的正則你會有豁然開朗的感覺。