麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Regex > 正文

經典JavaScript正則表達式實戰(附pdf)

2020-03-16 21:10:29
字體:
來源:轉載
供稿:網友
本文不是使用Dreamweaver編輯,以下測試代碼可能已經在賦值粘貼的過程做了一些調整,可能執行失效。可以參看
 
 
關于測試代碼 
本文不是使用Dreamweaver編輯,以下測試代碼可能已經在賦值粘貼的過程做了一些調整,可能執行失效。可以參看本文的pdf版本。 

匹配結尾的數字 
如 
復制代碼代碼如下:

30CAC0040 取出40 
3SFASDF92 取出92 

正則如下://d+$/g 

統一空格個數 

字符串內字符鍵有空格,但是空格的數量可能不一致,通過正則將空格的個數統一變為一個。 

例如:藍 色 理 想 

變成:藍 色 理 想 

aobert的正則: 
復制代碼代碼如下:

<script type="text/javascript"> 
var str="藍 色 理 想" 
var reg=//s+/g 
str = str.replace(reg," ") 
document.write(str) 
</script> 

判斷字符串是不是由數字組成 
來源:有沒有簡單的方法判斷字符串由數字組成? 

這個正則比較簡單,寫了一個測試 
復制代碼代碼如下:

<script type="text/javascript"> 
function isDigit(str){ 
var reg = /^/d*$/; 
return reg.test(str); 

var str = "7654321"; 
document.write(isDigit(str)); 
var str = "test"; 
document.write(isDigit(str)); 
</script> 

電話號碼正則 

:求一個驗證電話號碼的JS正則 
復制代碼代碼如下:

/^/d{3,4}-/d{7,8}(-/d{3,4})?$/區號必填為3-4位的數字,區號之后用“-”與電話號碼連接 

^/d{3,4}-電話號碼為7-8位的數字 

/d{7,8}分機號碼為3-4位的數字,非必填,但若填寫則以“-”與電話號碼相連接 

(-/d{3,4})?手機號碼正則表達式 

正則驗證手機號,忽略前面的0,支持130-139,150-159。忽略前面0之后判斷它是11位的。 

cloeft的正則: 
復制代碼代碼如下:

/^0*(13|15)/d{9}$/^0*匹配掉開頭任意數量的0。 

武林網發布的手機號碼 
復制代碼代碼如下:

function checkMobile(){ 
var sMobile = document.mobileform.mobile.value 
if(!(/^1[3|4|5|8][0-9]/d{4,8}$/.test(sMobile))){ 
alert("不是完整的11位手機號或者正確的手機號前七位"); 
document.mobileform.mobile.focus(); 
return false; 


由于手機號碼是13任意數字9位,和15任意數字9位,所以可以用(13|15)/d{9}匹配。 

測試代碼如下: 
復制代碼代碼如下:

function testReg(reg,str){ 
return reg.test(str); 

var reg =/^1[3|4|5|8][0-9]/d{4,8}$/; 
var str = '13889294444'; 
var str2 = '12889293333'; 
var str3 = '23445567'; 
document.write(testReg(reg,str)+'<br />'); 
document.write(testReg(reg,str2)+'<br />'); 
document.write(testReg(reg,str3)+'<br />'); 

使用正則表達式實現刪除字符串中的空格: 
來源:請問js中有沒有去掉空格的函數 

代碼以及測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
//刪除字符串兩側的空白字符。 
function trim(str){ 
return str.replace(/^/s+|/s+$/g,''); 

//刪除字符串左側的空白字符。 
function ltrim(str){ 
return str.replace(/^/s+/g,''); 

//刪除字符串右側的空白字符。 
function rtrim(str){ 
return str.replace(//s+$/g,''); 

//以下為測試代碼 
var trimTest = " 123456789 "; 
//前后各有一個空格。 
document.write('length:'+trimTest.length+'<br />'); 
//使用前 
document.write('ltrim length:'+ltrim(trimTest).length+'<br />'); 
//使用ltrim后 
document.write('rtrim length:'+rtrim(trimTest).length+'<br />'); 
//使用rtrim后 
document.write('trim length:'+trim(trimTest).length+'<br />'); 
//使用trim后 
</script> 

測試的結果如下: 

length:11 
ltrim length:10 
rtrim length:10 
trim length:9限制文本框只能輸入數字和小數點等等 
來源:文本框輸入限制的問題???? 

只能輸入數字和小數點 
復制代碼代碼如下:

var reg = /^/d*/.?/d{0,2}$/開頭有若干個數字,中間有0個或者一個小數點,結尾有0到2個數字。 

只能輸入小寫的英文字母和小數點,和冒號,正反斜杠(:.//) 
復制代碼代碼如下:

var reg = /[a-z/.////:]+/;a-z包括了小寫的英文字母,/.是小數點,//和//分別是左右反斜線,最后是冒號。整個組成一個字符集和代碼任一均可,最后在加上+,1或者多個。 

替換小數點前內容為指定內容 

請問 怎么把這個字符串的小數點前面的字符替換為我自定義的字符串啊? 
例如:infomarket.php?id=197 替換為 test.php?id=197 
應該可以把第一個點“.”之前的所有單詞字符替換為test就可以了。我寫的正則如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
var str = "infomarket.php?id=197"; 
var reg = /^/w*/ig; 
//匹配字符串開頭的任意個單詞字符 
str = str.replace(reg,'test'); 
document.write(str); 
</script> 

原帖的有點復雜,沒太看明白。 

只匹配中文的正則表達式 

前兩天看的《JavaScript開發王》里恰好有中文的unicode范圍,正則如下: 

/[/u4E00-/u9FA5/uf900-/ufa2d]/寫了一個簡單的測試,會把所有的中文替換成“哦”。 
復制代碼代碼如下:

<script type="text/javascript"> 
var str = "有中文?and English."; 
var reg = /[/u4E00-/u9FA5/uf900-/ufa2d]/ig; 
str = str.replace(reg,'哦'); 
document.write(str); 
</script> 

返回字符串的中文字符個數 


一般的字符長度對中文和英文都是不分別的 如JS里的length,那么如何返回字符串中中文字符的個數呢?guoshuang老師在原帖中給出了解決方案,我又沒看懂…… 

不過我自己也想到了一個辦法:先去掉非中文字符,再返回length屬性。函數以及測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function cLength(str){ 
var reg = /[^/u4E00-/u9FA5/uf900-/ufa2d]/g; 
//匹配非中文的正則表達式 
var temp = str.replace(reg,''); 
return temp.length; 

var str = "中文123"; 
document.write(str.length+'<br />'); 
document.write(cLength(str)); 
</script> 

結果: 


2中文兩個,數字三個,正確。 

下面的測試也正確。 
復制代碼代碼如下:

var str = "中文123tets@#!#%$#[][{}"; 
document.write(str.length+'<br />'); 
document.write(cLength(str)); 

正則表達式取得匹配IP地址前三段 
來源:如何用正則取IP前3段 

192.168.118.101,192.168.118.72, 192.168.118.1都替換成:192.168.118 

只要匹配掉最后一段并且替換為空字符串就行了,正則如下: 

//./d{1,3}$/匹配結尾的.n,.nn或者.nnn。 

測試代碼如下: 
復制代碼代碼如下:

function replaceReg(reg,str){ 
return str.replace(reg,'') 

var reg = //./d{1,3}$/; 
var str = '192.168.118.101'; 
var str2 = '192.168.118.72'; 
var str3 = '192.168.118.1'; 
document.write(replaceReg(reg,str)+'<br />'); 
document.write(replaceReg(reg,str2)+'<br />'); 
document.write(replaceReg(reg,str3)+'<br />'); 

相似的有,這個帖子里有一個驗證IP地址的方法:求檢驗MAC地址的正則表達例子 

匹配<ul>與<ul>之間的內容 
<ul>safsf<ul>safsf</ul><ul>safsf</ul></ul> 

用正則可以得到 <ul>起到下個<ul> 之間的內容。 

正則如下: 
復制代碼代碼如下:

/<ul>[/s/S]+?<ul>/i 

首先匹配兩側的ul標簽,中間的[/s/S]+?可以匹配一個或者多個任意字符,一定要非貪婪,否則會匹配<ul>safsf<ul>safsf</ul><ul>。 

用正則表達式獲得文件名 

c:/images/tupian/006.jpg 

可能是直接在盤符根目錄下,也可能在好幾層目錄下,要求替換到只剩文件名。 

xlez的正則如下: 
復制代碼代碼如下:

/[^////]*[////]+/g 

首先匹配非左右斜線字符0或多個,然后是左右斜線一個或者多個。形如“xxx/”或者“xxx/”或者“/”或者“/” 

函數以及測試代碼: 
復制代碼代碼如下:

<script type="text/javascript"> 
function getFileName(str){ 
var reg = /[^////]*[////]+/g; 
//xxx/或者是xxx/ 
str = str.replace(reg,''); 
return str; 

var str = "c://images//tupian//006.jpg"; 
document.write(getFileName(str)+'<br />'); 
var str2 = "c:/images/tupian/test2.jpg"; 
document.write(getFileName(str2)); 
</script> 

注意,/需要轉義。 

絕對路徑變相對路徑 
來源:討論一個正則 

將<IMG height="120" width="800" src="http://23.123.22.12/image/somepic.gif">轉換為:<IMG height="120" width="800" src="/image/somepic.gif">。 

其中網址可能改變,例如http://localhost等等。 

cloudchen的正則: 

/http:////[^//]+/首先是http://,然后[^//]+找過1個或者多個非/字符,因為遇到第一個/表示已經到目錄了,停止匹配。 

測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
var str = '<IMG height="120" width="800" / 
src="http://23.123.22.12/image/somepic.gif">'; 
var reg = /http:////[^//]+/; 
str = str.replace(reg,""); 
alert(str) 
</script> 

用戶名正則 

用于用戶名注冊,,用戶名只 能用 中文、英文、數字、下劃線、4-16個字符。 

hansir和解決方案弄成正則: 
復制代碼代碼如下:

/^[/u4E00-/u9FA5/uf900-/ufa2d/w]{4,16}$/ 

中文字符或者單詞字符,4到16個。實現4到16結成到正則里的關鍵就是開始^和結束$,這就等于整個字符串只能有這些匹配的內容,不能有多余的。 

函數和測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function isEmail(str){ 
var reg = /^[/u4E00-/u9FA5/uf900-/ufa2d/w]{4,16}$/; 
return reg.test(str); 

var str = '超級無敵用戶名regExp'; 
var str2 = '搗亂的@'; 
var str3 = '太短' 
var str4 = '太長longlonglonglonglonglonglonglong' 
document.write(isEmail(str)+'<br />'); 
document.write(isEmail(str2)+'<br />'); 
document.write(isEmail(str3)+'<br />'); 
document.write(isEmail(str4)+'<br />'); 
</script> 

匹配英文地址 
來源:-求助- 正則問題 

規則如下: 
包含 "點", "字母","空格","逗號","數字",但開頭和結尾不能是除字母外任何字符。 

[/.a-zA-Z/s,0-9]這個字符集就實現了字母,空格,逗號和數字。最終正則如下: 

/^[a-zA-Z][/.a-zA-Z/s,0-9]*?[a-zA-Z]+$/ 
開頭必須有字母,結束也必須是一個以上字母。測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function testReg(reg,str){ 
return reg.test(str); 

var reg = /^[a-zA-Z][/.a-zA-Z/s,0-9]*?[a-zA-Z]+$/; 
var str = 'No.8,ChangAn Street,BeiJing,China'; 
var str2 = '8.No,ChangAn Street,BeiJing,China'; 
var str3 = 'No.8,ChangAn Street,BeiJing,China88'; 
document.write(testReg(reg,str)+'<br />') 
document.write(testReg(reg,str2)+'<br />') 
document.write(testReg(reg,str3)+'<br />') 
</script> 

正則匹配價格 

價格的格式應該如下: 

開頭數字若干位,可能有一個小數點,小數點后面可以有兩位數字。hansir給出的對應正則如下: 

/^(/d*/./d{0,2}|/d+).*$/ 
hansir給出的測試代碼如下: 
復制代碼代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>無標題文檔</title> 
<script type="text/javascript"> 
function checkPrice(me){ 
if(!(/^(?:/d+|/d+/./d{0,2})$/.test(me.value))){ 
me.value = me.value.replace(/^(/d*/./d{0,2}|/d+).*$/,'$1'); 


</script> 
</head> 
<body> 
<input type="text" onkeyup="checkPrice(this);"/> 
</body> 
</html> 

身份證號碼的匹配 
來源:關于正則的,大家幫幫忙,急,在線等 

身份證號碼可以是15位或者是18位,其中最后一位可以是X。其它全是數字,正則如下: 

/^(/d{14}|/d{17})(/d|[xX])$/開頭是14位或者17位數字,結尾可以是數字或者是x或者是X。 

測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function testReg(reg,str){ 
return reg.test(str); 

var reg = /^(/d{14}|/d{17})(/d|[xX])$/; 
var str = '123456789012345';//15位 
var str2 = '123456789012345678';//18位 
var str3 = '12345678901234567X';//最后一位是X 
var str4 = '1234';//位數不對 
document.write(testReg(reg,str)+'<br />'); 
document.write(testReg(reg,str2)+'<br />'); 
document.write(testReg(reg,str3)+'<br />'); 
document.write(testReg(reg,str4)+'<br />'); 
</script> 

要求文本有指定行數 

匹配至少兩行的字符串,每行都為非空字符。 

只要匹配到[/n/r]就表示有換行了,再保證換行的兩段都不是空字符就可以了。正則如下: 

//S+?[/n/r]/S+?/i 
這個正則的應用應該是用在textarea里,如果是如下要求:可以支持所有字符,中間可帶空格,可以包括英文、數字、中文、標點 

這樣的話,只要針對空格再改一下就行了。(按照非空的要求,上面有不能匹配“字符+空格+換行+字符”的字符串)。修改如下: 

//S+?/s*?[/n/r]/s*?/S+?/i 
單詞首字母大寫 
來源:求個正則,處理英文單詞或詞組的 

每單詞首字大寫,其他小寫。如blue idea轉換為Blue Idea,BLUE IDEA也轉換為Blue Idea 

cloeft的正則: 
復制代碼代碼如下:

//b(/w)|/s(/w)/g 

所謂“首字母”包括兩種情況:第一種是邊界(開頭)的單詞字符,一種是空格之后的新單詞的第一個字母。測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function replaceReg(reg,str){ 
str = str.toLowerCase(); 
return str.replace(reg,function(m){return m.toUpperCase()}) 

var reg = //b(/w)|/s(/w)/g; 
var str = 'blue idea'; 
var str2 = 'BLUE IDEA'; 
var str3 = 'Test /n str is no good!'; 
var str4 = 'final test'; 
document.write(replaceReg(reg,str)+'<br />'); 
document.write(replaceReg(reg,str2)+'<br />'); 
document.write(replaceReg(reg,str3)+'<br />'); 
document.write(replaceReg(reg,str4)+'<br />'); 
</script> 

正則驗證日期格式 

yyyy-mm-dd格式 

正則如下: 
復制代碼代碼如下:

/^/d{4}-/d{1,2}-/d{1,2}$/ 

4位數字,橫線,1或者2位數字,再橫線,最后又是1或者2位數字。 

測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function testReg(reg,str){ 
return reg.test(str); 

var reg = /^/d{4}-/d{1,2}-/d{1,2}$/; 
var str = '2008-8-8'; 
var str2 = '2008-08-08'; 
var str3 = '08-08-2008'; 
var str4 = '2008 08 08'; 
document.write(testReg(reg,str)+'<br />'); 
document.write(testReg(reg,str2)+'<br />'); 
document.write(testReg(reg,str3)+'<br />'); 
document.write(testReg(reg,str4)+'<br />'); 
</script> 

第二種格式:來源:求一正則表達式 
yyyy-mm-dd 
或 
yyyy/mm/dd 

用“或”簡單地修改一下就行了。 

/^/d{4}(-|//)/d{1,2}(-|//)/d{1,2}$/去掉文件的后綴名 
來源:求一個正則 

www.abc.com/dc/fda.asp變為www.abc.com/dc/fda 

如果文件后綴已知的話這個問題就非常簡單了,正則如下: 

//.asp$/匹配最后的.asp而已,測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function delAspExtension(str){ 
var reg = //.asp$/; 
return str.replace(reg,''); 

var str = 'www.abc.com/dc/fda.asp'; 
document.write(delAspExtension(str)+'<br />'); 
</script> 

如果文件名未知的話就用這個正則://./w+$/,測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function delExtension(str){ 
var reg = //./w+$/; 
return str.replace(reg,''); 

var str = 'example.com/dc/fda.asp'; 
document.write(delExtension(str)+'<br />'); 
var str2 = 'test/regular/fda.do'; 
document.write(delExtension(str2)+'<br />'); 
var str3 = 'example.com/dc/fda.strange_extension'; 
document.write(delExtension(str3)+'<br />'); 
</script> 

驗證郵箱的正則表達式 
來源:找javascript寫的表單檢查代碼! 

fuchangxi的正則: 

/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(/.[a-zA-Z0-9_-])+/開始必須是一個或者多個單詞字符或者是-,加上@,然后又是一個或者多個單詞字符或者是-。然后是點“.”和單詞字符和-的組合,可以有一個或者多個組合。 
復制代碼代碼如下:

<script type="text/javascript"> 
function isEmail(str){ 
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(/.[a-zA-Z0-9_-])+/; 
return reg.test(str); 

var str = '[email protected]'; 
document.write(isEmail(str)+'<br />'); 
var str2 = '[email protected]'; 
document.write(isEmail(str2)+'<br />'); 
var str3 = '[email protected]'; 
document.write(isEmail(str3)+'<br />'); 
var str4 = '[email protected]'; 
document.write(isEmail(str4)+'<br />'); 
var str5 = '[email protected]'; 
document.write(isEmail(str5)+'<br />'); 
</script> 

我不太了解郵箱的具體規則。感覺這個正則比較簡單,EMAIL校驗 正則 討論 求解里有比較詳細的郵箱正則討論。 

匹配源代碼中的鏈接 
來源:正則 

能夠匹配HTML代碼中鏈接的正則。 

原帖正則: 

/<a href=".+?">.+?<//a>/g感覺有點嚴格,首先要<a href="".+?">有,而且href屬性可以是一個或者多個除換行外任意字符(非貪婪)。后面是.+?<//a>,一個或者多個除換行外任意字符(非貪婪),再加上結束標簽。

有個問題,如果a的起始標簽最后有空格,或者除了href還有其它屬性的話,上面的正則就不能匹配這個鏈接了。 

例如: 

<a href="asdfs" >……多了個空格。 

<a id="xx" href=""asdfs">……前面有屬性。 

…… 

重寫正則: 

/<a/s(/s*/w*?=".+?")*(/s*href=".+?")(/s*/w*?=".+?")*/s*>[/s/S]*?<//a>/ 
思路如下:首先要有<a和一個空格。/<a/s/ 

第一個(/s*/w*?=".+?")* 

可以匹配一個屬性,屬性前面可能有或者沒有多余的空格,用/s*匹配;屬性名肯定是單詞字符,用/w*?匹配;=".+?"就是匹配屬性值了非換行字符若干個;整個括號外面加個*表示可能有任意多個屬性。 

(/s*href=".+?") 

匹配href,它也是一個屬性,所以只要把上面子正則表達式中的/w修改為href=就行了。 

(/s*/w*?=".+?")*重復第一個子正則表達式,再次接受任意個屬性。 

/s*>,屬性最后再加上若干個空格和>。 

[/s/S]*?,鏈接的文字,可能有任何字符組成,若干個,非貪婪。 

<//a>最后是結束標簽。 

補充:屬性名和=之間,以及=和屬性值之間也可能有空格。所以要再加上幾個/s*。 

最后的實例代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function findLinks(str){ 
var reg = /<a/s(/s*/w*?/s*=/s*".+?")*(/s*href/s*=/s*".+?")(/s*/w*?/s*=/s*".+?") 
*/s*>[/s/S]*?<//a>/g; 
var arr = str.match(reg); 
for(var i=0;i<arr.length;i++){ 
//alert(arr[i]); 
document.write('link:'+arr[i]+'<br />'); 


var str = '<p>測試鏈接:<a id = "test" href="http://bbs.blueidea.com" style="border-left-color: rgb(0, 153, 204); border-left-width: 1px; border-left-style: solid; padding: 0px 3px; margin: 3px auto 0px; width: 640px; background-color: rgb(242, 246, 251); clear: both; border-top-color: rgb(0, 153, 204); border-top-width: 1px; border-top-style: solid; border-right-color: rgb(0, 153, 204); border-right-width: 1px; border-right-style: solid;"> 復制代碼代碼如下:

<script type="text/javascript"> 
function anchorText(str){ 
var reg =/<a/s(?:/s*/w*?/s*=/s*".+?")*(?:/s*href/s*=/s*".+?")(?:/s*/w*?/s*=/s*".+?")*/s*> 

([/s/S]*?)<//a>/; 
str = str.replace(reg,'$1'); 
return str; 

var str = '<a id = "test" href="http://bbs.blueidea.com" style="border-left-color: rgb(0, 153, 204); border-left-width: 1px; border-left-style: solid; padding: 0px 3px; margin: 3px auto 0px; width: 640px; background-color: rgb(242, 246, 251); clear: both; border-top-color: rgb(0, 153, 204); border-top-width: 1px; border-top-style: solid; border-right-color: rgb(0, 153, 204); border-right-width: 1px; border-right-style: solid;"> 復制代碼代碼如下:

<channel> 
<title>藍色理想</title> 
</channel> 
<item> 
<title>界面設計測試規范</title> 
</item> 
<item> 
<title>《古典寫實美女》漫畫教程</title> 
</item> 
<item> 
<title>安遠――消失的光年</title> 
</item> 
<item> 
<title>asp.net 2.0多語言網站解決方案</title> 
</item> 

要求匹配item里的title而不匹配channel里的title。 

基本正則: 

/<title>[/s/S]*?<//title>/gi 
首先是title標簽,內容為任意字符若干個,然后是title結束標簽。這個正則已經能匹配到所有的title標簽。 

首先,我簡單地修改了一下原正則: 

/<title>[^<>]*?<//title>/gi,因為title里面不應該再嵌有其它標簽,這個正則同樣是匹配所有標題的內容,最后再加上不去匹配channel中的title。整個正則如下: 

/<title>[^<>]*?<//title>(?!/s*<//channel>)/gi(?!/s*<//channel>)表示要匹配字符串的后面不能跟著若干個空格和一個channel的結束標簽。 

原帖里有很方便的測試工具,這里就不給測試代碼了。 

正則判斷是否為數字與字母的混合 
來源:關于正則 

不能小于12位,且必須為字母和數字的混合。 

驗證字符串包含數字簡單,驗證字符串包含字母也簡單,驗證字符串不包含其它字符也簡單,可以用這三個正則分別檢查一次字符串,邏輯運算出最終結果。 

但是怎么能把這些功能寫進一個正則表達式里呢?這個問題真有點傷腦筋。 

下面是lexrus的正則: 

/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ig思路非常的清晰啊: 

[a-z]+(?=[0-9]) 

字母開頭,后面必須緊跟著數字。 

[0-9]+(?=[a-z] 

數字開頭,后面必須緊跟著字母。 

[a-z0-9]+ 

后面的字符只要是數字或者字母就可以了。經過測試,發現不好使,123dd會被識別為不合法,dd123則為合法,可見“數字開頭,緊跟字母”的正則沒有起作用。測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function istrue(str){ 
var reg=/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ig; 
return reg.test(str); 

var str? = 'AaBc'; 
var str2 = 'aaa123'; 
var str3 = '123dd'; 
var str4 = '1230923403982'; 
document.write(istrue(str)+'<br />'); 
document.write(istrue(str2)+'<br />'); 
document.write(istrue(str3)+'<br />'); 
document.write(istrue(str4)+'<br />'); 
</script> 

結果為: 

false,true,false,false 

結果中的第三個,將'123dd'判斷為非法是錯誤的。剛開始以為是g的問題,去掉了還是不好使。應該是瀏覽器bug,我認為lexrus的正則是正確的,可能是瀏覽器無法處理或”|”的兩邊都包含正向預查(?=)。 

修改之后的正則如下: 

/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i意思和上面差不多,但是沒有使用正向預查,測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function istrue(str){ 
var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i; 
return reg.test(str); 

var str? = 'AaBc'; 
var str2 = 'aaa123'; 
var str3 = '123dd'; 
var str4 = '1230923403982'; 
document.write(istrue(str)+'<br />'); 
document.write(istrue(str2)+'<br />'); 
document.write(istrue(str3)+'<br />'); 
document.write(istrue(str4)+'<br />'); 
</script> 

結果為 

false,true,true,false 

正確。 

空格與英文同時存在 
來源:正則問題請指教啊! 

匹配英文以及空格,要求必須既有英文字母又有空格。 

這個思路和上面的差不多,只要把數字改成空格就可以了。正則如下: 

/^(([a-z]+/s+)|(/s+[a-z]+))[a-z/s]*$/i英文開頭加空格,或者是空格開頭加英文,后面可以是英文或者空格。測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function istrue(str){ 
var reg=/^(([a-z]+/s+)|(/s+[a-z]+))[a-z/s]*$/i; 
return reg.test(str); 

var str? = 'asdf'; 
var str2 = 'sadf sdf'; 
var str3 = 'asdf '; 
document.write(istrue(str)+'<br />'); 
document.write(istrue(str2)+'<br />'); 
document.write(istrue(str3)+'<br />'); 
</script> 

利用這個思路也可以實現英文空格英文,英文單詞多于兩個的匹配。同樣,也可以把英文字母換成單詞字符/w。 

顯示或者保存正則表達式匹配的部分內容 
有如下電話號碼: 

13588888333 
13658447322 
13558885354 
13587774654 
13854554786 

要求,要求只匹配135開頭的電話,但是匹配結果只保留135后面的數字。 

由于JavaScript里的正則不支持(?=xx)xxx的模式,只支持xxx(?=xx)的模式。所以只能將135后面的內容作為一個子正則表達式匹配的內容,然后再在后面引用。 

Carl給出的函數如下: 
復制代碼代碼如下:

function f(phoneNumber) { 
var pattern = /^(135)(/d{8})$/; 
if(pattern.test(phoneNumber)) 
return phoneNumber.replace(pattern,"$2"); 
else 
return "不是135打頭的手機號碼!"; 

/^(135)(/d{8})$/ 正則中,135作為開頭表示第一個子正則表達式,第二個括號內的子正則表達式則匹配后面的8個數字,然后在replace中使用$2就可以引用這個子正則表達式匹配的內容了。測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function f(phoneNumber) { 
var pattern = /^(135)(/d{8})$/; 
if(pattern.test(phoneNumber)) 
return phoneNumber.replace(pattern,"$2"); 
else 
return "不是135打頭的手機號碼!"; 

var arr = new Array( 
"13588888333", 
"13658447322", 
"13558885354", 
"13587774654", 
"13854554786" 
); 
for(var i = 0; i < arr.length; i++) 
document.write(f(arr[i])+'<br />'); 
</script> 

正則表達式替換變量 
來源:求教正則 

有一個數組: 

var _A = ['A','B','C','D']; 

有一個有“變量”的字符串。 

var _B = '<ul><li>$0$</li><li>$1$</li><li>$2$</li><li>$3$</li></ul>'; 

說是變量,其實只是字符串中的特殊字符,例如$0$,就稱這個為偽變量吧。 

最后的要求就是使用正則獲得下面這樣一個字符串: 

_C = '<ul><li>A</li><li>B</li><li>C</li><li>D</li></ul>'; 

IamUE給出了代碼: 
復制代碼代碼如下:

<script type="text/javascript"> 
var _A = ['A','B','C','D']; 
var _B = '<ul><li>$0$</li><li>$1$</li><li>$2$</li><li>$3$</li></ul>'; 
var reg=//$/d+/$/ig; 
C=_B.replace(reg,function($1){ 
var indexnum=$1.replace(//$/ig,""); 
if (indexnum<_A.length) 
{return _A[indexnum];} 
else{return ""} 
}); 
alert(C); 
</script> 

代碼分析:看到代碼之后感覺有點暈,首先,正則reg中沒有任何的括號,應該是沒有捕獲內容的,那么后面怎么又使用$1了引用了呢?通過alert測試,發現它是整個正則匹配的內容,而且不一定要寫作$1,可以寫為$0,甚至是寫為x都沒關系,它總是整個匹配。 

第一次,$1匹配到_B中的“$0$”,匿名函數中將它的$去掉,變成了0,檢查是否越界之后,用這個0作為下標去訪問數組_A。 

由于正則reg定義了g屬性,所以會繼續替換$1$、$2$等等。步驟都和上面一樣。 

正則替換指定屬性中的文本 
來源:怎樣用正則來查找替換? 

有如下代碼: 

<td align="center"><img src="../photo/ccg/thumbnails/O'Malley's West_jpg.gif" border="0" onClick="MM_openBrWindow('../photo/ccg/pages/O'Malley's West_jpg.htm','BE','width=386,height=306')"><br> 
O'Malley's West</td> 

要求將所有onclick屬性中的'替換成/',也就是將單引號轉義。 

首先,需要匹配onclick屬性: 

/onclick/s*=/s*".+?"/ig然后再將所有的'都替換成/'就可以了。 

將阿拉伯數字替換為中文大寫形式 
來源:正則問題 

將123替換成壹貳叁。 

只要匹配一個數字就可以了,測試代碼如下(如果顯示為亂碼就調整一下瀏覽器的字符編碼): 
復制代碼代碼如下:

function replaceReg(reg,str){ 
return str.replace(reg,function(m){return arr[m];}) 

arr=new Array("零","壹","貳","叁","肆","伍","陸","柒","捌","玖"); 
var reg = //d/g; 
var str = '13889294444'; 
var str2 = '12889293333'; 
var str3 = '23445567'; 
document.write(replaceReg(reg,str)+'<br />'); 
document.write(replaceReg(reg,str2)+'<br />'); 
document.write(replaceReg(reg,str3)+'<br />'); 

替換文本中的URL為鏈接 
來源:求一鏈接替換正則 

將一個用戶輸入的一段文字中的url替換成可以點擊的link地址。例如:http://www.blueidea.com可以替換成 [url]http://www.cctv.com[/url] 

或<a href="http://www.cctv.com">http://www. blueidea.com</a>. 

這個正則的關鍵就在于匹配鏈接,匹配之后,在兩邊加上a標簽和屬性不是問題。 

/http:////[/w-]*(/.[/w-]*)+/ig首先匹配http://。 

[/w-]*是可能的www和bbs等。 

/.[/w-]*匹配.xxx形式,至少有一個。 

測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function replaceReg(reg,str){ 
return str.replace(reg,function(m){return '<a href="'+m+'">'+m+'</a>';}) 

var reg = /http:////[/w-]*(/.[/w-]*)+/ig; 
var str = '將一個用戶輸入的一段文字中的url替換成可以點擊的link地址。/ 
測試一下:http://www.blueidea.com緊接著中文,還有http://bbs.blueidea.com / 
is very good!http://blueidea.com!最后在看看帶.cn的:http://www.sina.com.cn呵呵。'; 
document.write(replaceReg(reg,str)+'<br />'); 
</script> 

從HTML代碼段刪除指定標簽極其內容 
來源:關于正則的問題 

在一段代碼中去除<script ...... /script>, <head>...</head>,<%.....%>等代碼塊 

隆的正則: 

/<(script|meta|%)[/s/S]*?//(script|meta|%)>/試了一下,匹配如下文本正常: 
復制代碼代碼如下:

<script type="text/javascript"> 
我是要被刪除的腳本 
</script> 

哎。就剩下我了。但是,如果使用類似的正則: 

/<(script|head|%)[/s/S]*?//(script|head|%)>/ig 

匹配有嵌套的標簽: 
復制代碼代碼如下:

<head> 
<script type="text/javascript"> 
我是要被刪除的腳本 
</script> 
</head> 

哎。就剩下我了。實際匹配的內容是: 
復制代碼代碼如下:

<head> 
<script type="text/javascript"> 
我是要被刪除的腳本 
</script> 

這是因為[/s/S]*?里的非貪婪造成的。可以使用JavaScript正則里的反向引用來解決這個問題,如果起始標簽匹配了head,那么結束標簽也必須是head。最后的正則如下: 

/<(script|head|%)[/s/S]*?///1>/ig用正則給文本分段 
來源:怎樣用正則分段落 

原代碼:[title]標題一[/title]內容一232323sdfga [title]標題二[/title]內容二2232323 [title]標題三[/title]內容三2232323 

要把文本分段成如下格式: 
一、[title]標題一[/title]內容一232323sdfga 
二、[title]標題二[/title]內容二2232323 
三、[title]標題三[/title]內容三2232323 

只要用正則匹配title就可以了,所以正則比較簡單 

//[title/]/ig 
至于開始的的漢字序號,只要一個數組就解決了,最終代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function replaceReg(reg,str){ 
var mark =0; 
return str.replace(reg,function(m){mark++;return '<br />'+arr[mark]+'、'+m;}) 

var arr = ["零","壹","貳","叁","肆","伍","陸","柒","捌","玖"]; 
var reg = //[title/]/ig; 
var str = '[title]標題一[/title]內容一232323sdfga / 
[title]標題二[/title]內容二2232323 [title]標題三[/title]內容三2232323'; 
document.write(replaceReg(reg,str)+'<br />'); 
</script> 

轉換源代碼中的標簽 
來源:一個正則上的問題 

將代碼中的HTML標簽img轉換為[img]url[/img]。 

/<img(?:/s*/w*?/s*=/s*".+?")*?/s*src/s*=/s*"(.+?)"(?:/s*/w*?/s*=/s*".+?")*/s*>/ig 

這段正則和匹配鏈接標簽的正則基本一樣,修改如下,標簽名img,沒有結束標簽而是>結束。 

測試代碼如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function replaceReg(reg,str){ 
return str.replace(reg,'[img]$1[/img]') 

var reg = 
/<img(?:/s*/w*?/s*=/s*".+?")*?/s*src/s*=/s*"(.+?)"(?:/s*/w*?/s*=/s*".+?")*/s*>/ig; 
var str = '我就是傳說中的圖片了<img src="URL">哎。'; 
document.write(replaceReg(reg,str)+'<br />'); 
</script> 

第二個是替換object代碼嵌入的flash代碼替換為
Flash動畫
經典JavaScript正則表達式實戰(附pdf)在線播放
 
。 

針對原文的正則如下: 

/<object[/s/S]*?src=([/s/S]+?)(?=/s)[/s/S]*<//object>/i 
如果是所有的屬性都有雙引號的話正則也需要修改。 

測試如下: 
復制代碼代碼如下:

<script type="text/javascript"> 
function replaceReg(reg,str){ 
return str.replace(reg,'
Flash動畫
經典JavaScript正則表達式實戰(附pdf)在線播放
 
') 

var reg = /<object[/s/S]*?src=([/s/S]+?)(?=/s)[/s/S]*<//object>/i; 
var str = '<object classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 / 
codebase=http://download.macromedia.com/pub/shockwave/cabs/flash// 
swflash.cab#version=5,0,0,0 width=255 height=250><param name=movie / 
value=url><param name=quality value=high><embed src=url quality=high / 
pluginspage=http://www.macromedia.com/shockwave/download/index.cgi?/ 
P1_Prod_Version=ShockwaveFlash type=application/x-shockwave-flash / 
width=255 height=250></embed></object>'; 
document.write(replaceReg(reg,str)+'<br />'); 
</script> 

給屬性添加雙引號 
來源:請教正則表達式高手 

給HTML標簽中的屬性添加雙引號。 

<a href=xxx>改為:<a href="xxx"> 

LeXRus的第一個正則如下: 

/(?!/</w+)(/s+/w+)/=([^>/"/s]+)/ig第一個括號沒看明白,JS應該是不支持。所以我擅自給刪掉了,剩下的正則如下: 

/(/s+/w+)/=([^>/"/s]+)/ig第一個括號里的/s+/w+匹配的是屬性名。 

然后是=,不用轉義。 

第二個括號里的[^>/"/s]+匹配屬性值。不匹配>”和空格。這里的引號不用轉義。在意思不改變的情況下,稍微改了改,正則如下: 

/(/s+/w+)=([^>"/s]+)/ig需要注意的是這個正則不匹配=兩邊有空格的屬性,例如href = xxx。相匹配的話就改成: 

/(/s+/w+)/s*=/s*([^>"/s]+)/ig代碼: 

str=str.replace(/(?!/</w+)(/s+/w+)/=([^>/"/s]+)/ig,'$1="$2"'); 
其中'$1=”$2”'就實現了給屬性值添加上雙引號。不過ncs指出了這個正則替換的幾個問題,一是上面的空格問題,二是如果非標簽內部有等號,且前面又恰巧有空白字符的話,它將會被誤識別為屬性,例如: 

<a href=xxx target=yyy style="border-left-color: rgb(0, 153, 204); border-left-width: 1px; border-left-style: solid; padding: 0px 3px; margin: 3px auto 0px; width: 640px; background-color: rgb(242, 246, 251); clear: both; border-top-color: rgb(0, 153, 204); border-top-width: 1px; border-top-style: solid; border-right-color: rgb(0, 153, 204); border-right-width: 1px; border-right-style: solid;"> 復制代碼代碼如下:

<script type="text/javascript"> 
function rp(str,trg){ 
var reg1 = /(/s+/w+)/s*=/s*([^<>"/s]+)(?=[^<>]*>)/ig 
var reg2 = /"'([^'"]*)'"/ig; 
str=str.replace(reg1,'$1="$2"').replace(reg2,'/"$1/"'); 
trg.value=str; 

</script> 
<textarea id="sou" style="width:100%"> 
<a href = xxx name=aaa target=_blank style="border-left-color: rgb(0, 153, 204); border-left-width: 1px; border-left-style: solid; padding: 0px 3px; margin: 3px auto 0px; width: 640px; background-color: rgb(242, 246, 251); clear: both; border-top-color: rgb(0, 153, 204); border-top-width: 1px; border-top-style: solid; border-right-color: rgb(0, 153, 204); border-right-width: 1px; border-right-style: solid;"> 復制代碼代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<META name="Author" content="Sheneyan" /> 
<script type="text/javascript"> 
function encode(s){ 
return s.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/([///./*/[/]/(/)/$/^])/g,"//$1"); 

function decode(s){ 
return s.replace(///([///./*/[/]/(/)/$/^])/g,"$1").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&"); 

function highlight(s){ 
if (s.length==0){ 
alert('搜索關鍵詞未填寫!'); 
return false; 

s=encode(s); 
var obj=document.getElementsByTagName("body")[0]; 
var t=obj.innerHTML.replace(/<span/s+class=.?highlight.?>([^<>]*)<//span>/gi,"$1"); 
obj.innerHTML=t; 
var cnt=loopSearch(s,obj); 
t=obj.innerHTML 
var r=/{searchHL}(({(?!//searchHL})|[^{])*){//searchHL}/g 
t=t.replace(r,"<span class='highlight'>$1</span>"); 
obj.innerHTML=t; 
alert("搜索到關鍵詞"+cnt+"處") 

function loopSearch(s,obj){ 
var cnt=0; 
if (obj.nodeType==3){ 
cnt=replace(s,obj); 
return cnt; 

for (var i=0,c;c=obj.childNodes[i];i++){ 
if (!c.className||c.className!="highlight") 
cnt+=loopSearch(s,c); 

return cnt; 

function replace(s,dest){ 
var r=new RegExp(s,"g"); 
var tm=null; 
var t=dest.nodeValue; 
var cnt=0; 
if (tm=t.match(r)){ 
cnt=tm.length; 
t=t.replace(r,"{searchHL}"+decode(s)+"{/searchHL}") 
dest.nodeValue=t; 

return cnt; 

</script> 
<style type="text/css"> 
.highlight{background:green;font-weight:bold;color:white;} 
</style> 
</head> 
<body> 
<form onsubmit="highlight(this.s.value);return false;"> 
<p><input name="s" id="s" title="搜索內容:"/><input type="submit" value="搜索"/></p> 
</form> 
<div id="content"> 
測試高亮的代碼。很長很長的代碼…………………… 
</div> 
</body> 
</html> 

刪除標簽 
來源:如何使用正則表達式去除大部分HTML標記? 

刪除除了<img>、<br>、<p>之外所有的標簽。子虛烏有給出代碼中關鍵的一句: 

o.innerHTML.replace(/(<//?(?!br|p|img)[^>//]*)//?>/gi,''); 
剛開始沒反應過來,后來才想起來,這個正則不用區分起始和結束標簽。 

<//?(?!br|p|img) 

匹配除了保護標簽外標簽的起始標簽或者是結束標簽的一部分。 

[^>//]* 

匹配到>或者/就結束。 

//?> 

起始標簽或者結束標簽的結尾。

上一篇:php 正則表達式的子模式詳解

下一篇:正則表達式常用元字符整理小結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 精品一区二区在线播放 | 欧美精品18 | 娇妻被各种姿势c到高潮小说 | 日韩精品一二三区 | 激情亚洲网| 欧美一级特级 | 久久久入口| 国产福利不卡一区二区三区 | 亚洲成人福利电影 | 一级免费看片 | 羞羞电影网 | 51国产偷自视频区视频小蝌蚪 | 新久草视频| 久久精品免费网站 | www.guochan| 黄色作爱视频 | 免费在线观看成人av | 精品国产91久久久久久久妲己 | 国产精品久久久久久久久久久久午夜 | 国产免费专区 | 精品久久久久久中文字幕 | 黄色视频一级毛片 | 日韩视频精品 | 激情视频在线播放 | 密室逃脱第一季免费观看完整在线 | 成人三级电影网址 | 噜噜噜在线 | 国产一区在线免费 | 久久久久久久久久综合 | 视频在线色 | 日本在线免费观看视频 | 一区二区国产在线 | 欧美自拍三区 | 色综合视频网 | 4480午夜| xxxx hd video 69| 午夜视频在线免费播放 | 精品国产一区二区三区四区阿崩 | 一级做人爱c黑人影片 | 欧美四级在线观看 | 在线亚洲免费视频 |