JavaScript正則表達式

var reCat = new RegExp("cat", "gi");  //RegExp構造函數可以帶一個或兩個參數,第一個參數描述需要進行匹配的模式字符串,第二個參數指定了額外的處理命令
var reCat = /cat/gi;  //使用Perl風格的語法

	i:執行對大小寫不敏感的匹配
	g:執行全局匹配(查找所有匹配而非在找到第一個匹配後停止)
	m:執行多行匹配
元字符
元字符是表達式語法的一部分,在正則表達式中用到的所有元字符有:{ [ ( \ ^ $ | ) ] } ? * + -
如匹配一個問號:var reQMark = /\?/; 或 var reQMark = new RegExp("\\?"); //注意這裏是兩個反斜槓,雙重轉義

\xxx 查找以八進制數 xxx 規定的字符,如:/\142/爲字符b
\xdd 查找以十六進制數 dd 規定的字符,如:/\x62/爲字符b
\uxxxx 查找以十六進制數 xxxx 規定的 Unicode 字符,如:/\u0062/爲字符b
\r 查找回車符
\n 查找換行符
\f 查找換頁符
\t 查找製表符
\v 查找垂直製表符
\a 查找alert字符
\e 查找escape字符
\cX 查找與X相對應的控制字符
\0 查找 NULL 字符

. 查找單個字符,除了換行和行結束符,等同於[^\n\r]
\w 查找單詞字符,等同於[a-zA-Z_0-9]
\W 查找非單詞字符,等同於[^a-zA-Z_0-9]
\d 查找數字,等同於[0-9]
\D 查找非數字字符,等同於[^0-9]
\s 查找空白字符,等同於[ \t\n\x0B\f\r],\x0B爲垂直tab和\t一樣
\S 查找非空白字符,等同於[^ \t\n\x0B\f\r]
方括號
[abc] 查找方括號之間的任何字符
[^abc] 查找任何不在方括號之間的字符
[0-9] 查找任何從 0 至 9 的數字
[a-z] 查找任何從小寫 a 到小寫 z 的字符
[A-Z] 查找任何從大寫 A 到大寫 Z 的字符
[A-z] 查找任何從大寫 A 到小寫 z 的字符
[adgk] 查找給定集合內的任何字符
[^adgk] 查找給定集合外的任何字符
量詞
? 匹配任何包含零個或一個的字符串,如:ba?d匹配bd、bad
+ 匹配任何包含至少一個的字符串,如:ba+d匹配bad、baad
* 匹配任何包含零個或多個的字符串,如:ba*d匹配bd、bad、baad
{n} 匹配包含恰好出現n次的序列的字符串,如:ba{1}d匹配bad
{n,m} 匹配包含至少n次但不超過m次 的序列的字符串,如:ba{0,1}d匹配bd、bad
{n,} 匹配包含至少出現n次的序列的字符串,如:ba{0,}匹配bd、bad、baad、baaad

貪婪量詞:先看整個的字符串是否匹配,如果發現沒有匹配,去年該字符串中的最後一個字符並再次嘗試,如:?、+、*、{n}、{n, m}、{n, },默認就爲貪婪量詞
惰性量詞:先看字符串中的第一個字母是否匹配,如果單獨這一個字符還不夠,就讀入下一個字符,組成兩個字符的字符串,與貪婪量詞的工作方式恰好相反,如:??、+?、*?、{n}?、{n, m}?、{n, }?
支配量詞:只嘗試匹配整個字符串,如果整個字符串不能產生匹配,不做進一步嘗試,如:?+、++、*+、{n}+、{n, m}+、{n, }+

var sToMatch = "abbbaabbbaaabbb1234";
var re1 = /.*bbb/g;  //匹配結果爲"abbbaabbbaaabbb"
var re2 = /.*?bbb/g; //只有惰性量詞才能匹配成功,匹配結果爲"abbb","aabbb","aaabbb"
var re3 = /.*+bbb/g;  //匹配不了,直接報錯
複雜模式之分組:通過一系列括號包圍一系列字符、字符類以及量詞來使用的
/(dog){2}/  匹配"dogdog"
/([bd]ad?)*/  匹配空, "ba", "da", "bad", "dad"
/(mom( and dad)?)/  匹配"mom", "mom and dad"
/^\s*(.*?)\s+$/  匹配首尾的空白字符,也可以用/^\s+|\s+$/g
複雜模式之反向引用:也叫捕獲性分組,按照從左到右遇到的左括號字符的順序進行創建和編號的,例如表達式(A?(B?(C?)))將產生編號從1-3的三個反向引用:(A?(B?(C?)))、(B?(C?))、(C?)
反向引用有幾種不同的使用方法:
首先,使用正則表達式對象的test()、match()或search()方法後,反向引用的值可以從RegExp構造函數中獲得,如:
var sToMatch = "#123456789";
var reNumbers = /#(\d+)/;
reNumbers.test(sToMatch); 
alert(RegExp.$1);  //"123456789",$1保存了第一個反向引用,依次可以用$2,$3...
然後,可以直接在定義分組的表達式中包含反向引用,通過使用特殊轉義序列如\1、\2等實現
var sToMatch = "dogdog";
var reDogdog = /(dog)\1/;  //等同於/dogdog/
alert(reDogdog.test(sToMatch));  //true
第三,反向引用可以用在String對象的replace()方法中,通過使用特殊字符序列如$1、$2等實現
var sToChange = "1234 5678";
var reMatch = /(\d{4}) (\d{4})/;
alert(sToChange.replace(reMatch, "$2 $1"));  //"5678 1234"
複雜模式之候選:使用管道符(|)放在兩個單獨的模式之間
var reBadWords = /badword | anotherbadword/gi;
var sUserInput = "This is a String using badword1 and badword2.";
var sFinalText = sUserInput.replace(reBadWords, function(sMatch){
	return sMatch.replace(/./g, "*");  //用星號替換敏感詞中的每一個字母
});
複雜模式之非捕獲性分組:相比捕獲性分組,不會創建反向引用,在較長的正則表達式中,存儲反向引用會降低匹配速度,通過使用非捕獲性分組,仍然可以擁有與匹配字符串序列同樣的能力,而無需存儲結果的開銷
var sToMatch = "#123456789";
var reNumbers = /#(?:\d+)/;  //只需要在左括號的後面加上一個問號和一個緊跟的冒號就可創建一個非捕獲性分組
reNumbers.test(sToMatch); 
alert(RegExp.$1);  //"",輸出空字符串是因爲該分組是非捕獲性的
alert(sToMatch.replace(reNumbers, "abcd$1"));  //輸出結果是"abcd$1"而不是"abcd123456789",不能使用任何反向引用
又如:
String.prototype.stripHTML = function(){
	var reTag = /<(?:.|\s)*?>/g;  //匹配所有的HTML標籤,防止插入惡意HTML代碼
	return this.replace(reTag, "");
}
複雜模式之前瞻:告訴正則表達式運算器向前看一些字符而不移動其位置,存在正向前瞻(檢查接下來出現的是不是某個特定字符集)和負向前瞻(檢查接下來的不應該出現的特定字符集)
正向前瞻(?=n) 匹配任何其後緊接指定字符串 n 的但不包括 n的字符串,注意這裏的括號不是分組
負向前瞻(?!n) 匹配任何其後沒有緊接指定字符串 n 的字符串,如:

var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed1 = /(bed(?=room))/;
var reBed2 = /(bed(?!room))/;
alert(reBed1.test(sToMatch1));  //true
alert(RegExt.$1);  //輸出"bed"而不是"bedroom"
alert(reBed1.test(sToMatch2));  //false
alert(reBed2.test(sToMatch1));  //false
alert(reBed2.test(sToMatch2));  //true
alert(RegExt.$1);  //輸出的也是"bed"
複雜模式之邊界:用於正則表達式中表示模式的位置
n$ 匹配任何結尾爲 n 的字符串,如:/(\w+)\.$/匹配行尾單詞"one.","two."等
^n 匹配任何開頭爲 n 的字符串,如:/^(.+?)\b/匹配起始位置後的一個或多個單詞字符
\b 查找位於單詞的開頭或結尾的匹配,如:/\b(\S+?)\b/g 或 /(\w+)/g匹配從字符串中抽取單詞
\B 查找不處在單詞的開頭或結尾的匹配
複雜模式之多行模式:
var sToMatch = "First second\nthird fourth\nfifth sixth";
var reLastWordOnLine = /(\w+)$/gm;
alert(sToMatch.match(reLastWordOnLine));  //輸出["second", "fourth", "sixth"]而不只是"sixth"
RegExp對象的屬性和方法:
global  //RegExp 對象是否具有標誌 g
ignoreCase  //RegExp 對象是否具有標誌 i
multiline  //RegExp 對象是否具有標誌 m
source  //正則表達式的源文本
lastIndex  //一個整數,標示下一次匹配鈄會從哪個字符位置開始(只有當使用exec()和test()函數纔會填入,否則爲0)
真正使用到的是lastIndex,如:

var sToMatch = "bbq is short for barbecue";
var reB = /b/g;
reB.exec(sToMatch);  
alert(reB.lastIndex);  //1,匹配位置是0,lastIndex爲1
reB.exec(sToMatch);  
alert(reB.lastIndex);  //2
reB.exec(sToMatch);  
alert(reB.lastIndex);  //18
reB.lastIndex = 0;  //重頭開始匹配
reB.exec(sToMatch);  
alert(reB.lastIndex);  //1而不是21
靜態屬性
input,短名爲$_,最後用於匹配的字符串(傳遞給exec()或test()的字符串)
leftContext,短名爲$^,在上次匹配的前面的子串
rightContext,短名爲$^,在上次匹配之後的子串
lastMatch,短名爲$&,最後匹配的字符
lastParen,短名爲$+,最後匹配的分組
multiline,短名爲$*,用於指定是否所有的表達式都使用多行模式的布爾值,不同於其它屬性,不依賴最後一次執行的匹配,它可以設置所有的正則表達式的m選項,RegExp.multiline = "true";,注意IE和Opera不運行它
	var sToMatch = "this has been a short, short summer";
	var reShort = /(s)hort/g;
	reShort.test(sToMatch); 
	alert(RegExg.input);  //"this has been a short, short summer";
	alert(RegExg.leftContext);  //"this has been a ";
	alert(RegExg.rightContext);  //", short summer";
	alert(RegExg.lastMatch);  //"short"
	alert(RegExg.lastParen);  //"s"

compile()  //編譯正則表達式
alert(reCat.exec("a cat, a Cat, a cAt caT"));  //返回一個數組,數組中的第一個條目是第一個匹配,其他的是反向引用
alert(reCat.test("cat"));  //true,檢索字符串中指定的值,返回 true 或 false。 
支持正則表達式的String對象的方法
var sToMatch = "a bat, a Cat, a fAt, a faT cat";
var reAt = /at/gi;
alert(sToMatch.match(reAt));  //返回一個包含在字符串中的所有匹配的數組
alert(sToMatch.search(reAt));  //輸出第一次在字符串中出現的位置3,全局匹配g在search()時不起作用
alert(sToMatch.replace(reAt, "Dog"));  //替換與正則表達式匹配的子串
alert(sToMatch.replace(reAt, function(sMatch){
	return "Dog";
}));  
alert(sToMatch.split(/\,/));  //把字符串分割爲字符串數組
常用模式
日期:/(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20\d{2})/
URL:/^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$/
E-mail地址:/^(?:\w+\.?)*\w+@(?:\w+\.?)*\w+$/
國內電話號碼:d{3}-d{8}|d{4}-d{7}
騰訊QQ號:[1-9][0-9]{4,}
郵政編碼:[1-9]d{5}(?!d)
身份證:d{15}|d{18}
ip地址:d+.d+.d+.d+
中文字符: [u4e00-u9fa5]
雙字節字符(包括漢字在內):[^x00-xff]
	String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}
全角字符:/[^uFF00-uFFFF]/g
匹配特定數字:
^[1-9]\d*$    //匹配正整數
^-[1-9]\d*$   //匹配負整數
^-?[1-9]\d*$   //匹配整數
^[1-9]\d*|0$  //匹配非負整數(正整數 + 0)
^-[1-9]\d*|0$   //匹配非正整數(負整數 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮點數
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配負浮點數
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮點數
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非負浮點數(正浮點數 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮點數(負浮點數 + 0)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章