正則表達式是基於grep和ed這些Unix管理工具發展而來的,使用正則表達式可以使字符串處理變得更加方便快捷,以下內容主要是JavaScript 正則表達式的一些基礎知識彙總:
1. JavaScript正則表達式的實現
JavaScript 對正則表達式的支持是通過ECMAScript中的RegExp類實現的,RegExp對象的構造函數可以帶一個或兩個參數。第一個參數描述需要進行匹配 的模式字符串,第二個參數指定了額外的處理指令。
示例代碼:
程序代碼
var re=new RegExp("test","gi");
實現方法二:使用Perl風格的語法(較常用)
程序代碼
var re=/test/gi; //這種方式和上面是一樣的效果
2. 使用RegExp對象的方法
RegExp對象主要方法 有:RegExp.test(String) RegExp.exec(String) String.match(RegExp) String.search(RegExp)
2.1 test()方法
test()方法,如果給定字符串匹配這個模式, 就返回true,否則返回false。
示例代碼:
程序代碼
var re=/test/;
alert(re.test("this is the test content")); //output "true"
2.2 exec()方法
exec()方法和test()用法類似,不過 exec返回的是一個數組,並且只有一個條目,既是第一次的匹配。
示例代碼:
程序代碼
var re=/test/gi;
alert(re.exec("this is the test content")); //output "test"
2.3 match()方法
match()方法也是返回一個數組,不過使用方 法和上面有區別,match的使用方法為String.match(RegExp)。
示例代碼:
程序代碼
var re=/te/gi;
alert(("this is the test content").match(re)); //output "te, te"
2.4 search()方法
search()方法和字符串的 indexOf()方法類似,返回在字符串中出現的一個匹配的位置。
示例代碼:
程序代碼
var re=/te/i;
alert(("this is the test content").search(re)); //output 12
3. 在字符串方法中使用正則表達式
在字符串方法String.replace()和String.split()中使用正 則表達式。
3.1 String.replace()
示 例代碼:
程序代碼
var re=/te/gi;
alert(("this is the test content").replace(re,"ok")); //output "this is the okst conoknt"
3.2 String.split()
示例代碼:
程序代碼
var re=/te/gi;
alert(("this is the test content").split(re)); //output "this is the ,st con,nt"
4. 使用元字符
JavaScript正則表達式元字符:
程序代碼
( [ { \ ^ $ | ) ? * + .
任何時候要在正則表達式中使用元字符,都必須對他們進行轉義。
示例代碼:
程序代碼
var re=/\?/ //匹配?
var re2=new RegExp("\\?"); //匹配?
第 二行的定義中使用兩個反斜槓,主要是因為JavaScript字符串解析器會按照\n的方式翻譯\?,為了保證不出現這個問題,所以要在元字符前面使用兩 個反斜槓,我們稱之為雙重轉義。
5. 使用特殊字符
在表達式中可以使用字符串本身, 也可以使用它的ASCII碼或者Unicode代碼,要用ASCII碼來表示一個字符,則必須制定一個兩位的十六進制代碼,並在前面加上\x。例如:字符 b的ASCII碼為98,轉換成十六進製為62,既是\x62。
示例代碼:
程序代碼
var re=/\x62/;
alert(re.test("blue")); //output "true"
另外也可以使用八進制代替十六進製表示。
示例代碼:
程序代碼
var re=/\142/; //使用八進製表示
alert(re.test("blue")); //output "true"
如果使用 Unicode來表示字符,必須制定字符串的四位十六進製表示形式,比如b的表示方式為:\u0062
示例代碼:
程序代碼
var re=/\u0062/; //使用Unicode表示
alert(re.test("blue")); //output "true"
另外一些需要雙重 轉義的字符:
程序代碼
\t \n \r \r \a \e \cX \b \v \0
6. 正則表達式字符類
6.1 簡單類 [abc...]
示 例代碼:
程序代碼
var re=/[gts]o/g; //匹配go to so
alert(("you go to bed,so will i").match(re)); //output "go to so"
6.2 負向類 [^abc]
負向類主要是採用排除策略,例如[^abc],既是排除a b c三個字符。
示例代碼:
程序代碼
var re=/[^gts]o/g; //排除g t s +o
alert(("you go to bed,so do i").match(re)); //output "yo do"
6.3 範圍類 [a-z]
範圍類主要是不方便枚舉,但連續的一系列字符或數字等。
示例代碼:
程序代碼
var re=/a[3-5]/g;
alert(("a1,a2,a3,a4,a5,a6").match(re)); //output "a3,a4,a5"
6.4 組合類 [a-z0-9\r\n]
組合類是有幾種方式組合而成的字 符串。
示例代碼:
程序代碼
var re=/[a-b3-5]/g;
alert(("a1,a2,a3,a4,a5,a6").match(re)); //output "a,a,a,3,a,4,a,5,a"
6.5 預定義類
常用的預定義類:
程序代碼
. [^\n\r]
\d [0-9]
\D [^0-9]
\s [ \t\n\x0B\f\r]
\S [^ \t\n\x0B\f\r]
\w [a-zA-Z0-9]
\W [^a-zA-Z0-9]
7. 量 詞
7.1 簡單量詞
程序代碼
? {0,1}
* {0,}
+ {1,}
{n} 一定出現n 次
{n,m} 至少出現n次,但不超過m次
{n,} 至少出現n次
示 例代碼:
程序代碼
var re=/g?oo?d?/g; //可匹配o go goo good oo ood od
alert(("to go is good").match(re)); //output "o go good"
7.2 貪婪的(? * + {n} {n,m} {n,})
貪婪的先看整個 的字符串是否匹配,如果沒有匹配,就去掉最後一個字符,然後再次進行匹配,以此規則進行下去......
示例代碼:
程序代碼
var str="abc abcd abcde";
var re=/.*c/g; //貪婪 方式匹配
alert(re.exec(str)); //output "abc abcd abc"
7.3 懶惰的 (?? *? +? {n}? {n,m}? {n,}?)
懶惰的跟貪婪的匹配方向相反,懶惰的先從第 一個字符開始匹配,如果不成功,就讀入下一個字符繼續進行匹配,以此規則進行下去...
示例代碼:
程序代碼
var str="abc abcd abcde";
var re=/.*?c/g; //貪 婪方式匹配
alert(re.exec(str)); //output "abc"
7.4 支配的 (?+ *+ ++ {n}+ {n,m}+ {n,}+)
支配的只嘗試匹配整個字符串,如果整個字符串不能匹配,不做進一步嘗 試,此方法瀏覽器支持不太好,不推薦使用。
8. 複雜模式
8.1 分組
分組是通過用一系列括號包圍一系列字符、字符類以及量詞來使用 的。
示例代碼:
程序代碼
var re=/g(o)+gle/g; "o"至少出現1次
alert(("gogle google gooooogle").match(re)); //output "gogle google gooooogle"
8.2 反向引用(backreference)
利用分組進行正則匹配後,每個分組都被存儲在一個特殊的地 方,這些存儲在分組中的特殊值,我們稱之為反向引用(backreference)。
示例代碼:
程序代碼
var re=/(\d+)/;
re.test("123456789");
alert(RegExp.$1); //output "123456789"
8.3 候選
候選其實就是個or選擇。使用|分隔。
示例代 碼:
程序代碼
var re=/you|me/g;
alert(("say you say me").match(re)); //output "you, me"
8.4 非捕獲性分組(?:)
不創建反向引用的分組,我們稱之為非捕獲性分 組,使用非捕獲性分組,可以除去捕獲性分組存儲分組的時間消耗,提高程序執行效率。
示例代碼:
程序代碼
var re=/(?:\d+)/;
re.test("123456789");
alert(RegExp.$1); //output ""
8.5 前瞻(lookahead) (?= )
有時候,希望某個特定的字符 出現在另一個字符串之前時,才會捕獲它。前瞻告訴正則表達式運算器向前看一些字符而不移動其位置。 前瞻有負向(?!)和正向(?=)之分。
示 例代碼:
程序代碼
var re=/(good(?=lu))/g;
var str="goodluck is lucy";
alert(str.match(re)); //output "good"
8.6 邊界
程序代碼
^ 行開頭
$ 行結尾
\b 單 詞的邊界
\B 非單詞的邊界
示例代碼:
程序代碼
var re=/^(.+?)\b/g; //以懶惰的方式匹配單詞
var str="goodluck is lucy";
alert(str.match(re)); //output "goodluck"
8.7 多行模式(m)
匹配多行,常配合g使用。
示例代碼:
程序代碼
var re=/(\w+)$/gm; //匹配每行末尾的一個單詞
var str="goodluck is lucy\ngo to bed";
alert(str.match(re)); //output "lucy, bed"
沒有留言:
張貼留言