正則表達式口訣及經常使用正則表達式

注:本文僅爲學習正則時爲了便於記憶而做,不能代替系統而全面的學習過程,錯漏之處,敬請指正!  
正則其實也勢利,削尖頭來把錢揣; (指開始符號^和結尾符號$)  
特殊符號認不了,弄個倒槓來引路; (指\. \*等特殊符號)  
倒槓後面跟小w, 數字字母來表示; (\w跟數字字母;\d跟數字)  
倒槓後面跟小d, 只有數字來表示;  
倒槓後面跟小a, 報警符號嘀一聲;  
倒槓後面跟小b, 單詞分界或退格;  
倒槓後面跟小t, 製表符號很明瞭;  
倒槓後面跟小r, 回車符號知道了;  
倒槓後面跟小s, 空格符號很重要;  
小寫跟罷跟大寫,多得實在不得了;  
倒槓後面跟大W, 字母數字靠邊站;  
倒槓後面跟大S, 空白也就靠邊站;  
倒槓後面跟大D, 數字今後靠邊站;  
倒框後面跟大B, 不含開頭和結尾;  

單個字符要重複,三個符號來幫忙; (* + ?)  
0 星加1 到無窮,問號只管0 和1; (*表0-n;+表1-n;?表0-1次重複)  
花括號裏學問多,重複操做能力強; ({n} {n,} {n,m})  
若要重複字符串,園括把它括起來; ((abc){3} 表示字符串「abc」重複3次 )  
特殊集合自定義,中括號來幫你忙;  
轉義符號行不通,一個一個來排隊;  
實在多得排不下,橫槓請來幫個忙; ([1-5])  
尖頭放進中括號,反義定義威力大; ([^a]指除「a」外的任意字符 )  
1豎做用可不小,兩邊正則互替換; (鍵盤上與「\」是同一個鍵)  
1豎能用不少次,複雜定義很方便;  
園括號,用途多;  
反向引用指定組,數字排符對應它; (「\b(\w+)\b\s+\1\b」中的數字「1」引用前面的「(\w+)」)  
支持組名自定義,問號加上尖括號; (「(?<Word>\w+)」中把「\w+」定義爲組,組名爲「Word」)  
園括號,用途多,位置指定全靠它;  
問號等號字符串,定位字符串前面; (「\b\w+(?=ing\b)」定位「ing」前面的字符串)  
若要定位串後面,中間插個小於號; (「(?<=\bsub)\w+\b」定位「sub」後面的字符串)  
問號加個驚歎號,後面跟串字符串;  
PHPer都知道, !是取反的意思;  
後面不跟這一串,通通符合來報到; (「\w*d(?!og)\w*」,「dog」不符合,「do」符合)  
問號小於驚歎號,後面跟串字符串;  
前面不放這一串,通通符合來報到;  
點號星號很貪婪,加個問號不貪婪;  
加號問號有保底,至少重複一次多;  
兩個問號老規矩,0次1次團團轉;  
花括號後跟個?,貪婪變成不貪婪;  
還有不少裝不下,等着之後來增長。  
--------------------------------------------------------------------------------  


一些經常使用的正則表達式  

"^\d+$"  //非負整數(正整數 + 0)  
"^[0-9]*[1-9][0-9]*$"  //正整數  
"^((-\d+)|(0+))$"  //非正整數(負整數 + 0)  
"^-[0-9]*[1-9][0-9]*$"  //負整數  
"^-?\d+$"    //整數  
"^\d+(\.\d+)?$"  //非負浮點數(正浮點數 + 0)  
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮點數  
"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮點數(負浮點數 + 0)  
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //負浮點數  
"^(-?\d+)(\.\d+)?$"  //浮點數  
"^[A-Za-z]+$"  //由26個英文字母組成的字符串  
"^[A-Z]+$"  //由26個英文字母的大寫組成的字符串  
"^[a-z]+$"  //由26個英文字母的小寫組成的字符串  
"^[A-Za-z0-9]+$"  //由數字和26個英文字母組成的字符串  
"^\w+$"  //由數字、26個英文字母或者下劃線組成的字符串  
"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址  
"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url  
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日  
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年  
"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil  
"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //電話號碼  
"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址  



匹配中文字符的正則表達式: [\u4e00-\u9fa5]  
匹配雙字節字符(包括漢字在內):[^\x00-\xff]  
匹配空行的正則表達式:\n[\s| ]*\r  
匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/  
匹配首尾空格的正則表達式:(^\s*)|(\s*$)  
匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*  
匹配網址URL的正則表達式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$  
匹配賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$  
匹配國內電話號碼:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?  
匹配騰訊QQ號:^[1-9]*[1-9][0-9]*$  

下表是元字符及其在正則表達式上下文中的行爲的一個完整列表:  

\ 將下一個字符標記爲一個特殊字符、或一個原義字符、或一個後向引用、或一個八進制轉義符。  

^ 匹配輸入字符串的開始位置。若是設置了 RegExp 對象的Multiline 屬性,^ 也匹配 '\n' 或 '\r' 以後的位置。 

$ 匹配輸入字符串的結束位置。若是設置了 RegExp 對象的Multiline 屬性,$ 也匹配 '\n' 或 '\r' 以前的位置。  

* 匹配前面的子表達式零次或屢次。  

+ 匹配前面的子表達式一次或屢次。+ 等價於 {1,}。  

? 匹配前面的子表達式零次或一次。? 等價於 {0,1}。  

{n} n 是一個非負整數,匹配肯定的n 次。  

{n,} n 是一個非負整數,至少匹配n 次。  

{n,m} m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗號和兩個數之間不能有空格。  

? 當該字符緊跟在任何一個其餘限制符 (*, +, ?, {n}, {n,}, {n,m}) 後面時,匹配模式是非貪婪的。非貪婪模式儘量少的匹配所搜索的字符串,而默認的貪婪模式則儘量多的匹配所搜索的字符串。  

. 匹配除 "\n" 以外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用象 '[.\n]' 的模式。  
(pattern) 匹配pattern 並獲取這一匹配。  

(?:pattern) 匹配pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供之後使用。  

(?=pattern) 正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不須要獲取供之後使用。  

(?!pattern) 負向預查,與(?=pattern)做用相反  

x|y 匹配 x 或 y。  

[xyz] 字符集合。  

[^xyz] 負值字符集合。  

[a-z] 字符範圍,匹配指定範圍內的任意字符。  

[^a-z] 負值字符範圍,匹配任何不在指定範圍內的任意字符。  

\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。  

\B 匹配非單詞邊界。  

\cx 匹配由x指明的控制字符。  

\d 匹配一個數字字符。等價於 [0-9]。  

\D 匹配一個非數字字符。等價於 [^0-9]。  

\f 匹配一個換頁符。等價於 \x0c 和 \cL。  

\n 匹配一個換行符。等價於 \x0a 和 \cJ。  

\r 匹配一個回車符。等價於 \x0d 和 \cM。  

\s 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。  

\S 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。  

\t 匹配一個製表符。等價於 \x09 和 \cI。  

\v 匹配一個垂直製表符。等價於 \x0b 和 \cK。  

\w 匹配包括下劃線的任何單詞字符。等價於'[A-Za-z0-9_]'。  

\W 匹配任何非單詞字符。等價於 '[^A-Za-z0-9_]'。  

\xn 匹配 n,其中 n 爲十六進制轉義值。十六進制轉義值必須爲肯定的兩個數字長。  

\num 匹配 num,其中num是一個正整數。對所獲取的匹配的引用。  

\n 標識一個八進制轉義值或一個後向引用。若是 \n 以前至少 n 個獲取的子表達式,則 n 爲後向引用。不然,若是 n 爲八進制數字 (0-7),則 n 爲一個八進制轉義值。  

\nm 標識一個八進制轉義值或一個後向引用。若是 \nm 以前至少有is preceded by at least nm 個獲取得子表達式,則 nm 爲後向引用。若是 \nm 以前至少有 n 個獲取,則 n 爲一個後跟文字 m 的後向引用。若是前面的條件都不知足,若 n 和 m 均爲八進制數字 (0-7),則 \nm 將匹配八進制轉義值 nm。  

\nml 若是 n 爲八進制數字 (0-3),且 m 和 l 均爲八進制數字 (0-7),則匹配八進制轉義值 nml。  

\un 匹配 n,其中 n 是一個用四個十六進制數字表示的Unicode字符。  

匹配中文字符的正則表達式: [u4e00-u9fa5]  

匹配雙字節字符(包括漢字在內):[^x00-xff]  

應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)  

String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}  

匹配空行的正則表達式:n[s| ]*r  

匹配HTML標記的正則表達式:/<(.*)>.*</1>|<(.*) />/  

匹配首尾空格的正則表達式:(^s*)|(s*$)  

應用:javascript中沒有像vbscript那樣的trim函數,咱們就能夠利用這個表達式來實現,以下:  

String.prototype.trim = function()  
{  
return this.replace(/(^s*)|(s*$)/g, "");  
}  

利用正則表達式分解和轉換IP地址:  

下面是利用正則表達式匹配IP地址,並將IP地址轉換成對應數值的Javascript程序:  

function IP2V(ip)  
{  
re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正則表達式  
if(re.test(ip))  
{  
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1  
}  
else  
{  
throw new Error("Not a valid IP address!")  
}  
}  

不過上面的程序若是不用正則表達式,而直接用split函數來分解可能更簡單,程序以下:  

var ip="10.100.20.168"  
ip=ip.split(".")  
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))  

匹配Email地址的正則表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*  

匹配網址URL的正則表達式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?  

利用正則表達式去除字串中重複的字符的算法程序:  

var s="abacabefgeeii"  
var s1=s.replace(/(.).*1/g,"$1")  
var re=new RegExp("["+s1+"]","g")  
var s2=s.replace(re,"")  
alert(s1+s2) //結果爲:abcefgi  

得用正則表達式從URL地址中提取文件名的javascript程序,以下結果爲page1  

s="http://www.9499.net/page1.htm"  
s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2")  
alert(s)  

利用正則表達式限制網頁表單裏的文本框輸入內容:  

用正則表達式限制只能輸入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"  

用正則表達式限制只能輸入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"  

用正則表達式限制只能輸入數字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"  

用正則表達式限制只能輸入數字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" javascript

相關文章
相關標籤/搜索