js常用的正則表達(dá)式

2021-10-29 15:06 更新

正則表達(dá)式中的特殊字符

字符 含意

\ 做為轉(zhuǎn)意,即通常在"\"后面的字符不按原來(lái)意義解釋?zhuān)?b/匹配字符"b",當(dāng)b前面加了反斜桿后/\b/,轉(zhuǎn)意為匹配一個(gè)單詞的邊界。 
-或- 
對(duì)正則表達(dá)式功能字符的還原,如"*"匹配它前面元字符0次或多次,/a*/將匹配a,aa,aaa,加了"\"后,/a\*/將只匹配"a*"。 

^ 匹配一個(gè)輸入或一行的開(kāi)頭,/^a/匹配"an A",而不匹配"An a" 
$ 匹配一個(gè)輸入或一行的結(jié)尾,/a$/匹配"An a",而不匹配"an A" 
* 匹配前面元字符0次或多次,/ba*/將匹配b,ba,baa,baaa 
+ 匹配前面元字符1次或多次,/ba+/將匹配ba,baa,baaa 
? 匹配前面元字符0次或1次,/ba?/將匹配b,ba 
(x) 匹配x保存x在名為$1...$9的變量中 
x|y 匹配x或y 
{n} 精確匹配n次 
{n,} 匹配n次以上 
{n,m} 匹配n-m次 
[xyz] 字符集(character set),匹配這個(gè)集合中的任一一個(gè)字符(或元字符) 
[^xyz] 不匹配這個(gè)集合中的任何一個(gè)字符 
[\b] 匹配一個(gè)退格符 
\b 匹配一個(gè)單詞的邊界 
\B 匹配一個(gè)單詞的非邊界 
\cX 這兒,X是一個(gè)控制符,/\cM/匹配Ctrl-M 
\d 匹配一個(gè)字?jǐn)?shù)字符,/\d/ = /[0-9]/ 
\D 匹配一個(gè)非字?jǐn)?shù)字符,/\D/ = /[^0-9]/ 
\n 匹配一個(gè)換行符 
\r 匹配一個(gè)回車(chē)符 
\s 匹配一個(gè)空白字符,包括\n,\r,\f,\t,\v等 
\S 匹配一個(gè)非空白字符,等于/[^\n\f\r\t\v]/ 
\t 匹配一個(gè)制表符 
\v 匹配一個(gè)重直制表符 
\w 匹配一個(gè)可以組成單詞的字符(alphanumeric,這是我的意譯,含數(shù)字),包括下劃線,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9] 
\W 匹配一個(gè)不可以組成單詞的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。

用re = new RegExp("pattern",["flags"]) 的方式比較好 
pattern : 正則表達(dá)式 
flags: g (全文查找出現(xiàn)的所有 pattern) 
i (忽略大小寫(xiě)) 
m (多行查找)

vaScript動(dòng)態(tài)正則表達(dá)式問(wèn)題

請(qǐng)問(wèn)正則表達(dá)式可以動(dòng)態(tài)生成嗎? 
例如JavaScript中: 
var str = "strTemp"; 
要生成: 
var re = /strTemp/; 
如果是字符連接: 
var re = "/" + str + "/"即可 
但是要生成表達(dá)式,可以實(shí)現(xiàn)嗎?怎樣實(shí)現(xiàn)?

 

正則表達(dá)式是一個(gè)描述字符模式的對(duì)象。 
JavaScript的RegExp對(duì)象和String對(duì)象定義了使用正則表達(dá)式來(lái)執(zhí)行強(qiáng)大的模式匹配和文本檢索與替換函數(shù)的方法.

在JavaScript中,正則表達(dá)式是由一個(gè)RegExp對(duì)象表示的.當(dāng)然,可以使用一個(gè)RegExp()構(gòu)造函數(shù)來(lái)創(chuàng)建RegExp對(duì)象, 
也可以用JavaScript 1.2中的新添加的一個(gè)特殊語(yǔ)法來(lái)創(chuàng)建RegExp對(duì)象.就像字符串直接量被定義為包含在引號(hào)內(nèi)的字符一樣, 
正則表達(dá)式直接量也被定義為包含在一對(duì)斜杠(/)之間的字符.所以,JavaScript可能會(huì)包含如下的代碼:

var pattern = /s$/;

這行代碼創(chuàng)建一個(gè)新的RegExp對(duì)象,并將它賦給變量parttern.這個(gè)特殊的RegExp對(duì)象和所有以字母"s"結(jié)尾的字符串都匹配.用RegExp()也可以定義
一個(gè)等價(jià)的正則表達(dá)式,代碼如下:

var pattern = new RegExp("s$");

無(wú)論是用正則表達(dá)式直接量還是用構(gòu)造函數(shù)RegExp(),創(chuàng)建一個(gè)RegExp對(duì)象都是比較容易的.較為困難的任務(wù)是用正則表達(dá)式語(yǔ)法來(lái)描述字符的模式. 
JavaScript采用的是Perl語(yǔ)言正則表達(dá)式語(yǔ)法的一個(gè)相當(dāng)完整的子集.

正則表達(dá)式的模式規(guī)范是由一系列字符構(gòu)成的.大多數(shù)字符(包括所有字母數(shù)字字符)描述的都是按照字面意思進(jìn)行匹配的字符.這樣說(shuō)來(lái),正則表達(dá)式/java/就和所有包含子串 "java" 的字符串相匹配.雖然正則表達(dá)式中的其它字符不是按照字面意思進(jìn)行匹配的,但它們都具有特殊的意義.正則表達(dá)式 /s$/ 包含兩個(gè)字符. 第一個(gè)特殊字符 "s" 是按照字面意思與自身相匹配.第二個(gè)字符 "$" 是一個(gè)特殊字符,它所匹配的是字符串的結(jié)尾.所以正則表達(dá)式 /s$/ 匹配的就是以字母 "s" 結(jié)尾的字符串.


1.直接量字符

我們已經(jīng)發(fā)現(xiàn)了,在正則表達(dá)式中所有的字母字符和數(shù)字都是按照字面意思與自身相匹配的.JavaScript的正則表達(dá)式還通過(guò)以反斜杠(\)開(kāi)頭的轉(zhuǎn)義序列支持某些非字母字符.例如,序列 "\n" 在字符串中匹配的是一個(gè)直接量換行符.在正則表達(dá)式中,許多標(biāo)點(diǎn)符號(hào)都有特殊的含義.下面是這些字符和它們的含義:

正則表達(dá)式的直接量字符

字符 匹配 
________________________________

字母數(shù)字字符 自身 
\ f 換頁(yè)符 
\ n 換行符 
\ r 回車(chē) 
\ t 制表符 
\ v 垂直制表符 
\ / 一個(gè) / 直接量 
\ \ 一個(gè) \ 直接量 
\ . 一個(gè) . 直接量 
\ * 一個(gè) * 直接量 
\ + 一個(gè) + 直接量 
\ ? 一個(gè) ? 直接量 
\ | 一個(gè) | 直接量 
\ ( 一個(gè) ( 直接量 
\ ) 一個(gè) ) 直接量 
\ [ 一個(gè) [ 直接量 
\ ] 一個(gè) ] 直接量 
\ { 一個(gè) { 直接量 
\ } 一個(gè) } 直接量 
\ XXX 由十進(jìn)制數(shù) XXX 指 定的ASCII碼字符 
\ Xnn 由十六進(jìn)制數(shù) nn 指定的ASCII碼字符 
\ cX 控制字符^X. 例如, \cI等價(jià)于 \t, \cJ等價(jià)于 \n

___________________________________________________

如果想在正則表達(dá)式中使用特殊的標(biāo)點(diǎn)符號(hào),必須在它們之前加上一個(gè) "\" .


2.字符類(lèi)

將單獨(dú)的直接符放進(jìn)中括號(hào)內(nèi)就可以組合成字符類(lèi).一個(gè)字符類(lèi)和它所包含的任何一個(gè)字符都匹配,所以正則表達(dá)式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一個(gè)都匹配.另外還可以定義否定字符類(lèi),這些類(lèi)匹配的是除那些包含在中括號(hào)之內(nèi)的字符外的所有字符.定義否定字符尖時(shí),要將一個(gè) ^ 符號(hào)作為從左中括號(hào)算起的第一個(gè)字符.正則表達(dá)式的集合是 / [a-zA-z0-9] / .

由于某些字符類(lèi)非常常用,所以JavaScript的正則表達(dá)式語(yǔ)法包含一些特殊字符和轉(zhuǎn)義序列來(lái)表示這些常用的類(lèi).例如, \s 匹配的是空格符,制表符和其它空白符, \s 匹配的則是空白符之外的任何字符.

正則表灰式的字符類(lèi)

字符 匹配 
____________________________________________________

[...] 位于括號(hào)之內(nèi)的任意字符 
[^...] 不在括號(hào)之中的任意字符 
. 除了換行符之外的任意字符,等價(jià)于[^\n] 
\w 任何單字字符, 等價(jià)于[a-zA-Z0-9] 
\W 任何非單字字符,等價(jià)于[^a-zA-Z0-9] 
\s 任何空白符,等價(jià)于[\ t \ n \ r \ f \ v] 
\S 任何非空白符,等價(jià)于[^\ t \ n \ r \ f \ v] 
\d 任何數(shù)字,等價(jià)于[0-9] 
\D 除了數(shù)字之外的任何字符,等價(jià)于[^0-9] 
[\b] 一個(gè)退格直接量(特例) 
________________________________________________________________


3.復(fù)制

用以上的正則表式的語(yǔ)法,可以把兩位數(shù)描述成 / \ d \ d /,把四位數(shù)描述成 / \d \ d \ d \ d /.但我們還沒(méi)有一種方法可以用來(lái)描述具有任意多數(shù)位的數(shù)字或者是一個(gè)字符串.這個(gè)串由三個(gè)字符以及跟隨在字母之后的一位數(shù)字構(gòu)成.這些復(fù)雜的模式使用的正則表達(dá)式語(yǔ)法指定了該表達(dá)式中每個(gè)元素要重復(fù)出現(xiàn)的次數(shù).

指定復(fù)制的字符總是出現(xiàn)在它們所作用的模式后面.由于某種復(fù)制類(lèi)型相當(dāng)常用.所以有一些特殊的字符專(zhuān)門(mén)用于表示它們.例如: +號(hào)匹配的就是復(fù)制前一模式一次或多次的模式.下面的表列出了復(fù)制語(yǔ)法.先看一個(gè)例子:

/\d{2, 4}/ //匹配2到4間的數(shù)字.

/\w{3} \d?/ //匹配三個(gè)單字字符和一個(gè)任意的數(shù)字.

/\s+java\s+/ //匹配字符串"java" ,并且該串前后可以有一個(gè)或多個(gè)空格.

/[^"] * / //匹配零個(gè)或多個(gè)非引號(hào)字符.


正則表達(dá)式的復(fù)制字符

字符 含義 
__________________________________________________________________

{n, m} 匹配前一項(xiàng)至少n次,但是不能超過(guò)m次 
{n, } 匹配前一項(xiàng)n次,或者多次 
{n} 匹配前一項(xiàng)恰好n次 
? 匹配前一項(xiàng)0次或1次,也就是說(shuō)前一項(xiàng)是可選的. 等價(jià)于 {0, 1} 
+ 匹配前一項(xiàng)1次或多次,等價(jià)于{1,} 
* 匹配前一項(xiàng)0次或多次.等價(jià)于{0,} 
___________________________________________________________________


4.選擇,分組和引用

正則表達(dá)式的語(yǔ)法還包括指定選擇項(xiàng),對(duì)子表達(dá)式分組和引用前一子表達(dá)式的特殊字符.字符| 用于分隔供選擇的字符.例如: /ab|cd|ef/ 匹配的是字符串 "ab",或者是字符串 "cd",又或者 "ef". /\d{3}|[a-z]{4}/ 匹配的是要么是一個(gè)三位數(shù),要么是四個(gè)小寫(xiě)字母.在正則表達(dá)式中括號(hào)具有幾種作用.它的主要作用是把單獨(dú)的項(xiàng)目分組成子表達(dá)式,以便可以像處理一個(gè)獨(dú)立的單元那種用 *、+或? 來(lái)處理那些項(xiàng)目.例如: /java(script) ?/ 匹配的是字符串 "java",其后既可以有 "script",也可以沒(méi)有. /

(ab|cd) + |ef) / 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的一次或多次重復(fù).

在正則表達(dá)式中,括號(hào)的第二個(gè)用途是在完整的模式中定義子模式。當(dāng)一個(gè)正則表達(dá)式成功地和目標(biāo)字符串相匹配時(shí),可以從目標(biāo)串中抽出和括號(hào)中的子模式相匹配的部分.例如,假定我們正在檢索的模式是一個(gè)或多個(gè)字母后面跟隨一位或多位數(shù)字,那么我們可以使用模式 / [a-z] + \ d+/.但是由于假定我們真正關(guān)心的是每個(gè)匹配尾部的數(shù)字,那么如果我們將模式的數(shù)字部分放在括號(hào)中 (/ [a-z] + (\d+)/) ,我們就可以從所檢索到的任何匹配中抽取數(shù)字了,之后我們會(huì)對(duì)此進(jìn)行解析的.

代括號(hào)的子表達(dá)式的另一個(gè)用途是,允許我們?cè)谕徽齽t表達(dá)式的后面引用前面的子表達(dá)式.這是通過(guò)在字符串 \ 后加一位或多位數(shù)字來(lái)實(shí)現(xiàn)的.數(shù)字指的是代括號(hào)的子表達(dá)式在正則表達(dá)式中的位置.例如: \1 引用的是第一個(gè)代括號(hào)的子表達(dá)式. \3 引用的是第三個(gè)代括號(hào)的子表達(dá)式.注意,由于子表達(dá)式可以嵌套在其它子表達(dá)式中,

所以它的位置是被計(jì)數(shù)的左括號(hào)的位置.

例如:在下面的正則表達(dá)式被指定為 \2: 
/([Jj]ava([Ss]cript)) \sis \s (fun\w*) /


對(duì)正則表達(dá)式中前一子表達(dá)式的引用所指定的并不是那個(gè)子表達(dá)式的模式,而是與那個(gè)模式相匹配的文本.這樣,引用就不只是幫助你輸入正則表達(dá)式的重復(fù)部分的快

捷方式了,它還實(shí)施了一條規(guī)約,那就是一個(gè)字符串各個(gè)分離的部分包含的是完全相同的字符.例如:下面的正則表達(dá)式匹配的就是位于單引號(hào)或雙引號(hào)之內(nèi)的所有字符.但是,它要求開(kāi)始和結(jié)束的引號(hào)匹配(例如兩個(gè)都是雙引號(hào)或者都是單引號(hào)): 
/[' "] [^ ' "]*[' "]/


如果要求開(kāi)始和結(jié)束的引號(hào)匹配,我們可以使用如下的引用: 
/( [' "] ) [^ ' "] * \1/


\1匹配的是第一個(gè)代括號(hào)的子表達(dá)式所匹配的模式.在這個(gè)例子中,它實(shí)施了一種規(guī)約,那就是開(kāi)始的引號(hào)必須和結(jié)束的引號(hào)相匹配.注意,如果反斜杠后跟隨的數(shù)字比代括號(hào)的子表達(dá)式數(shù)多,那么它就會(huì)被解析為一個(gè)十進(jìn)制的轉(zhuǎn)義序列,而不是一個(gè)引用.你可以堅(jiān)持使用完整的三個(gè)字符來(lái)表示轉(zhuǎn)義序列,這們就可以避免混淆了.例如, 使用 \044,而不是\44.下面是正則表達(dá)式的選擇、分組和引用字符:

字符 含義 
____________________________________________________________________

| 選擇.匹配的要么是該符號(hào)左邊的子表達(dá)式,要么它右邊的子表達(dá)式 
(...) 分組.將幾個(gè)項(xiàng)目分為一個(gè)單元.這個(gè)單元可由 *、+、?和|等符號(hào)使用,而且還可以記住和這個(gè)組匹配的字符以供此后引

用使用 
\n 和第n個(gè)分組所匹配的字符相匹配.分組是括號(hào)中的子表達(dá)式(可能是嵌套的).分組號(hào)是從左到右計(jì)數(shù)的左括號(hào)數(shù) 
____________________________________________________________________

 

5.指定匹配的位置

我們已經(jīng)看到了,一個(gè)正則表達(dá)式中的許多元素才能夠匹配字符串的一個(gè)字符.例如: \s 匹配的只是一個(gè)空白符.還有一些正則表達(dá)式的元素匹配的是字符之間寬度為0的空間,而不是實(shí)際的字符例如: \b 匹配的是一個(gè)詞語(yǔ)的邊界,也就是處于一個(gè)/w字字符和一個(gè)\w非字字符之間的邊界.像\b 這樣的字符并不指定任何一個(gè)匹配了的字符串中的字符,它們指定的是匹配所發(fā)生的合法位置.有時(shí)我們稱(chēng)這些元素為正則表達(dá)式的錨.因?yàn)樗鼈儗⒛J蕉ㄎ辉跈z索字符串中的一個(gè)特定位置.最常用的錨元素是 ^, 它使模式依賴(lài)于字符串的開(kāi)頭,而錨元素$則使模式定位在字符串的末尾.

例如:要匹配詞 "javascript" ,我們可以使用正則表達(dá)式 /^ javascript $/. 如果我們想檢索 "java" 這個(gè)詞自身 (不像在 "javascript" 中那樣作為前綴),那么我們可以使用模式 /\s java \s /, 它要求在詞語(yǔ)java之前和之后都有空格.但是這樣作有兩個(gè)問(wèn)題.第一: 如果 "java" 出現(xiàn)在一個(gè)字符的開(kāi)頭或者是結(jié)尾.該模式就不會(huì)與之匹配,除非在開(kāi)頭和結(jié)尾處有一個(gè)空格. 第二: 當(dāng)這個(gè)模式找到一個(gè)與之匹配的字符時(shí),它返回的匹配的字符串前端和后端都有空格,這并不是我們想要的.因此,我們使用詞語(yǔ)的邊界 \b 來(lái)代替真正的空格符 \s 進(jìn)行匹配. 結(jié)果表達(dá)式是 /\b java \b/.

下面是正則表達(dá)式的錨字符:

字符 含義 
____________________________________________________________________

^ 匹配的是字符的開(kāi)頭,在多行檢索中,匹配的是一行的開(kāi)頭 
$ 匹配的是字符的結(jié)尾,在多行檢索中,匹配的是一行的結(jié)尾 
\b 匹配的是一個(gè)詞語(yǔ)的邊界.簡(jiǎn)而言之就是位于字符\w 和 \w之間的位置(注意:[\b]匹配的是退格符) 
\B 匹配的是非詞語(yǔ)的邊界的字符 
_____________________________________________________________________


6.屬性

有關(guān)正則表達(dá)式的語(yǔ)法還有最后一個(gè)元素,那就是正則表達(dá)式的屬性,它說(shuō)明的是高級(jí)模式匹配的規(guī)則.和其它正則表達(dá)式語(yǔ)法不同,屬性是在 / 符號(hào)之外說(shuō)明的.即它們不出現(xiàn)在兩個(gè)斜杠之間,而是位于第二個(gè)斜杠之后.javascript 1.2支持兩個(gè)屬性.屬性 i 說(shuō)明模式匹配應(yīng)該是大小寫(xiě)不敏感的.屬性 g 說(shuō)明模式匹配應(yīng)該是全局的.也

就是說(shuō),應(yīng)該找出被檢索的字符串中所有的匹配.這兩種屬性聯(lián)合起來(lái)就可以執(zhí)行一個(gè)全局的,大小寫(xiě)不敏感的匹配.

例如: 要執(zhí)行一個(gè)大小不敏感的檢索以找到詞語(yǔ) "java" (或者是 "java" 、"JAVA"等) 的第一個(gè)具體值,我們可以使用大小不敏感的正則表達(dá)式 /\b java\b/i .如果要在一個(gè)字符串中找到 "java" 所有的具體值,我們還可以添加屬性 g, 即 /\b java \b/gi .

以下是正則表達(dá)式的屬性:


字符 含義 
_________________________________________

i 執(zhí)行大小寫(xiě)不敏感的匹配 
g 執(zhí)行一個(gè)全局的匹配,簡(jiǎn)而言之,就是找到所有的匹配,而不是在找到第一個(gè)之后就停止了 
_________________________________________

除屬性 g 和 i 之外,正則表達(dá)式就沒(méi)有其它像屬性一樣的特性了.如果將構(gòu)造函數(shù) RegExp 的靜態(tài)屬性 multiline 設(shè)置為 true ,那么模式匹配將以多行的模式進(jìn)行.在這種模式下,錨字符 ^ 和 $ 匹配的不只是檢索字符串的開(kāi)頭和結(jié)尾,還匹配檢索字符串內(nèi)部的一行的開(kāi)頭和結(jié)尾.例如: 模式 /Java$/ 匹配的是 "Java",但是并不匹配

"Java\nis fun" .如果我們?cè)O(shè)置了 multiline 屬性,那么后者也將被匹配:

RegExp.multiline = true;

在JAVASCRIPT里面判斷一個(gè)字符串是否是電子郵件的格式: 

代碼如下:

if(formname.email.value!=formname.email.value.match(/^\w +[@]\w +[.][\w.] +$/)) 

alert("您的電子郵件格式錯(cuò)誤!"); 
formname.email.focus(); 
return false; 
}


[RED]function dateVerify(date){ 
var reg = /^(\d{4})(-)(\d{2})\2(\d{2})$/; 
var r = date.match(reg); 
if(r==null) return false; 
var d= new Date(r[1], r[3]-1,r[4]); 
var newStr=d.getFullYear()+r[2]+(d.getMonth()+1)+r[2]+d.getDate(); 
date=r[1]+r[2]+((r[3]-1)+1)+r[2]+((r[4]-1)+1); 
return newStr==date; 
}[/RED] 


javascript的17種正則表達(dá)式 

"^\\d+$"  //非負(fù)整數(shù)(正整數(shù) + 0) 
"^[0-9]*[1-9][0-9]*$"  //正整數(shù) 
"^((-\\d+)|(0+))$"  //非正整數(shù)(負(fù)整數(shù) + 0) 
"^-[0-9]*[1-9][0-9]*$"  //負(fù)整數(shù) 
"^-?\\d+$"    //整數(shù) 
"^\\d+(\\.\\d+)?$"  //非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0) 
"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮點(diǎn)數(shù)
"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0) 
"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //負(fù)浮點(diǎn)數(shù)
"^(-?\\d+)(\\.\\d+)?$"  //浮點(diǎn)數(shù) 
"^[A-Za-z]+$"  //由26個(gè)英文字母組成的字符串 
"^[A-Z]+$"  //由26個(gè)英文字母的大寫(xiě)組成的字符串 
"^[a-z]+$"  //由26個(gè)英文字母的小寫(xiě)組成的字符串 
"^[A-Za-z0-9]+$"  //由數(shù)字和26個(gè)英文字母組成的字符串 
"^\\w+$"  //由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串 
"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"    //email地址 
"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"  //url 

正則表達(dá)式對(duì)象的屬性及方法

預(yù)定義的正則表達(dá)式擁有有以下靜態(tài)屬性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。其中input和multiline可以預(yù)設(shè)置。其他屬性的值在執(zhí)行過(guò)exec或test方法后被根據(jù)不同條件賦以不同的值。許多屬性同時(shí)擁有長(zhǎng)和短(perl風(fēng)格)的兩個(gè)名字,并且,這兩個(gè)名字指向同一個(gè)值。(JavaScript模擬perl的正則表達(dá)式)

正則表達(dá)式對(duì)象的屬性

屬性 含義 
$1...$9 如果它(們)存在,是匹配到的子串 
$_ 參見(jiàn)input 
$* 參見(jiàn)multiline 
$& 參見(jiàn)lastMatch 
$+ 參見(jiàn)lastParen 
$` 參見(jiàn)leftContext 
$'' 參見(jiàn)rightContext 
constructor 創(chuàng)建一個(gè)對(duì)象的一個(gè)特殊的函數(shù)原型 
global 是否在整個(gè)串中匹配(bool型) 
ignoreCase 匹配時(shí)是否忽略大小寫(xiě)(bool型) 
input 被匹配的串 
lastIndex 最后一次匹配的索引 
lastParen 最后一個(gè)括號(hào)括起來(lái)的子串 
leftContext 最近一次匹配以左的子串 
multiline 是否進(jìn)行多行匹配(bool型) 
prototype 允許附加屬性給對(duì)象 
rightContext 最近一次匹配以右的子串 
source 正則表達(dá)式模式 
lastIndex 最后一次匹配的索引 
 

正則表達(dá)式對(duì)象的方法 
方法 含義 
compile 正則表達(dá)式比較 
exec 執(zhí)行查找 
test 進(jìn)行匹配 
toSource 返回特定對(duì)象的定義(literal representing),其值可用來(lái)創(chuàng)建一個(gè)新的對(duì)象。重載Object.toSource方法得到的。 
toString 返回特定對(duì)象的串。重載Object.toString方法得到的。 
valueOf 返回特定對(duì)象的原始值。重載Object.valueOf方法得到 

例子 

代碼如下:

<script language = "JavaScript"> 
var myReg = /(w+)s(w+)/; 
var str = "John Smith"; 
var newstr = str.replace(myReg, "$2, $1"); 
document.write(newstr); 
</script> 

將輸出"Smith, John" 

javascript正則表達(dá)式檢驗(yàn) 
代碼如下:

//校驗(yàn)是否全由數(shù)字組成 
function isDigit(s) 

var patrn=/^[0-9]{1,20}$/; 
if (!patrn.exec(s)) return false 
return true 
}

//校驗(yàn)登錄名:只能輸入5-20個(gè)以字母開(kāi)頭、可帶數(shù)字、“_”、“.”的字串 
function isRegisterUserName(s) 

var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/; 
if (!patrn.exec(s)) return false 
return true 
}

//校驗(yàn)用戶姓名:只能輸入1-30個(gè)以字母開(kāi)頭的字串 
function isTrueName(s) 

var patrn=/^[a-zA-Z]{1,30}$/; 
if (!patrn.exec(s)) return false 
return true 
}

//校驗(yàn)密碼:只能輸入6-20個(gè)字母、數(shù)字、下劃線 
function isPasswd(s) 

var patrn=/^(\w){6,20}$/; 
if (!patrn.exec(s)) return false 
return true 
}

//校驗(yàn)普通電話、傳真號(hào)碼:可以“+”開(kāi)頭,除數(shù)字外,可含有“-” 
function isTel(s) 

//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/; 
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; 
if (!patrn.exec(s)) return false 
return true 
}

//校驗(yàn)手機(jī)號(hào)碼:必須以數(shù)字開(kāi)頭,除數(shù)字外,可含有“-” 
function isMobil(s) 

var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; 
if (!patrn.exec(s)) return false 
return true 
}

//校驗(yàn)郵政編碼 
function isPostalCode(s) 

//var patrn=/^[a-zA-Z0-9]{3,12}$/; 
var patrn=/^[a-zA-Z0-9 ]{3,12}$/; 
if (!patrn.exec(s)) return false 
return true 
}

//校驗(yàn)搜索關(guān)鍵字 
function isSearch(s) 

var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;'\,.<>/?]{1}[^`~!@$%^&()+=|\\\][\]\{\}:;'\,.<>?]{0,19}$/;
if (!patrn.exec(s)) return false 
return true 
}

function isIP(s) //by zergling 

var patrn=/^[0-9.]{1,20}$/; 
if (!patrn.exec(s)) return false 
return true 


正則表達(dá)式regular expression詳述(一)

正則表達(dá)式是regular expression,看來(lái)英文比中文要好理解多了,就是檢查表達(dá)式符 
不符合規(guī)定??!正則表達(dá)式有一個(gè)功能十分強(qiáng)大而又十分復(fù)雜的對(duì)象RegExp,在JavaScript1.2 版本以上提供。

下面我們看看有關(guān)正則表達(dá)式的介紹: 
正則表達(dá)式對(duì)象用來(lái)規(guī)范一個(gè)規(guī)范的表達(dá)式(也就是表達(dá)式符不符合特定的要求,比如是不是Email地址格式等),它具有用來(lái)檢查給出的字符串是否符合規(guī)則的屬性和方法。

除此之外,你用RegExp構(gòu)造器建立的個(gè)別正則表達(dá)式對(duì)象的屬性,就已經(jīng)預(yù)先定義好了正則表達(dá)式對(duì)象的靜態(tài)屬性,你可以隨時(shí)使用它們。

核心對(duì)象: 
在JavaScript 1.2, NES 3.0以上版本提供。 
在JavaScript 1.3以后版本增加了toSource方法。

建立方法: 
文字格式或RegExp構(gòu)造器函數(shù)。 
文字建立格式使用以下格式: 
/pattern/flags即/模式/標(biāo)記

構(gòu)造器函數(shù)方法使用方法如下: 
new RegExp("pattern"[, "flags"])即new RegExp("模式"[,"標(biāo)記"])

參數(shù): 
pattern(模式) 
表示正則表達(dá)式的文本

flags(標(biāo)記) 
如果指定此項(xiàng),flags可以是下面值之一: 
g: global match(全定匹配) 
i: ignore case(忽略大小寫(xiě)) 
gi: both global match and ignore case(匹配所有可能的值,也忽略大小寫(xiě))

注意:文本格式中的參數(shù)不要使用引號(hào)標(biāo)記,而構(gòu)造器函數(shù)的參數(shù)則要使用引號(hào)標(biāo)記。所以下面的表達(dá)式建立同樣的正則表達(dá)式: 
/ab+c/i 
   new RegExp("ab+c", "i")

描述: 
當(dāng)使用構(gòu)造函數(shù)的時(shí)候,必須使用正常的字符串避開(kāi)規(guī)則(在字符串中加入前導(dǎo)字符\ )是必須的。 
例如,下面的兩條語(yǔ)句是等價(jià)的: 
re = new RegExp("\\w+") 
re = /\w+/

下面的提供了在正則表達(dá)式中能夠使用的完整對(duì)特殊字符的一個(gè)完整的列表和描述。

表1.3:正則表達(dá)式中的特殊字符:

字符\ 
意義:對(duì)于字符,通常表示按字面意義,指出接著的字符為特殊字符,\不作解釋。 
例如:/b/匹配字符'b',通過(guò)在b 前面加一個(gè)反斜杠\,也就是/\b/,則該字符變成特殊字符,表示匹配一個(gè)單詞的分界線。

或者: 
對(duì)于幾個(gè)字符,通常說(shuō)明是特殊的,指出緊接著的字符不是特殊的,而應(yīng)該按字面解釋。 
例如:*是一個(gè)特殊字符,匹配任意個(gè)字符(包括0個(gè)字符);例如:/a*/意味匹配0個(gè)或多個(gè)a。 
為了匹配字面上的*,在a前面加一個(gè)反斜杠;例如:/a\*/匹配'a*'。

字符^ 
意義:表示匹配的字符必須在最前邊。 
例如:/^A/不匹配"an A,"中的'A',但匹配"An A."中最前面的'A'。

字符$ 
意義:與^類(lèi)似,匹配最末的字符。 
例如:/t$/不匹配"eater"中的't',但匹配"eat"中的't'。

字符* 
意義:匹配*前面的字符0次或n次。 
例如:/bo*/匹配"A ghost booooed"中的'boooo'或"A bird warbled"中的'b',但不匹配"A goat grunted"中的任何字符。

字符+ 
意義:匹配+號(hào)前面的字符1次或n次。等價(jià)于{1,}。 
例如:/a+/匹配"candy"中的'a'和"caaaaaaandy."中的所有'a'。

字符? 
意義:匹配?前面的字符0次或1次。 
例如:/e?le?/匹配"angel"中的'el'和"angle."中的'le'。

字符. 
意義:(小數(shù)點(diǎn))匹配除換行符外的所有單個(gè)的字符。 
例如:/.n/匹配"nay, an apple is on the tree"中的'an'和'on',但不匹配'nay'。

字符(x) 
意義:匹配'x'并記錄匹配的值。 
例如:/(foo)/匹配和記錄"foo bar."中的'foo'。匹配子串能被結(jié)果數(shù)組中的素[1], ..., [n] 返回,或被RegExp對(duì)象的屬性$1, ..., $9返回。

字符x|y 
意義:匹配'x'或者'y'。 
例如:/green|red/匹配"green apple"中的'green'和"red apple."中的'red'。

字符{n} 
意義:這里的n是一個(gè)正整數(shù)。匹配前面的n個(gè)字符。 
例如:/a{2}/不匹配"candy,"中的'a',但匹配"caandy," 中的所有'a'和"caaandy."中前面的兩個(gè) 
'a'。

字符{n,} 
意義:這里的n是一個(gè)正整數(shù)。匹配至少n個(gè)前面的字符。 
例如:/a{2,}不匹配"candy"中的'a',但匹配"caandy"中的所有'a'和"caaaaaaandy."中的所有'a'

字符{n,m} 
意義:這里的n和m都是正整數(shù)。匹配至少n個(gè)最多m個(gè)前面的字符。 
例如:/a{1,3}/不匹配"cndy"中的任何字符,但匹配 "candy,"中的'a',"caandy," 中的前面兩個(gè) 
'a'和"caaaaaaandy"中前面的三個(gè)'a',注意:即使"caaaaaaandy" 中有很多個(gè)'a',但只匹配前面的三個(gè)'a'即"aaa"。

字符[xyz] 
意義:一字符列表,匹配列出中的任一字符。你可以通過(guò)連字符-指出一個(gè)字符范圍。 
例如:[abcd]跟[a-c]一樣。它們匹配"brisket"中的'b'和"ache"中的'c'。

字符[^xyz] 
意義:一字符補(bǔ)集,也就是說(shuō),它匹配除了列出的字符外的所有東西。 你可以使用連字符-指出一 字符范圍。 
例如:[^abc]和[^a-c]等價(jià),它們最早匹配"brisket"中的'r'和"chop."中的'h'。

字符[\b] 
意義:匹配一個(gè)空格(不要與\b混淆)

字符\b 
意義:匹配一個(gè)單詞的分界線,比如一個(gè)空格(不要與[\b]混淆) 
例如:/\bn\w/匹配"noonday"中的'no',/\wy\b/匹配"possibly yesterday."中的'ly'。

字符\B 
意義:匹配一個(gè)單詞的非分界線 
例如:/\w\Bn/匹配"noonday"中的'on',/y\B\w/匹配"possibly yesterday."中的'ye'。

字符\cX 
意義:這里的X是一個(gè)控制字符。匹配一個(gè)字符串的控制字符。 
例如:/\cM/匹配一個(gè)字符串中的control-M。

字符\d 
意義:匹配一個(gè)數(shù)字,等價(jià)于[0-9]。 
例如:/\d/或/[0-9]/匹配"B2 is the suite number."中的'2'。

字符\D 
意義:匹配任何的非數(shù)字,等價(jià)于[^0-9]。 
例如:/\D/或/[^0-9]/匹配"B2 is the suite number."中的'B'。

字符\f 
意義:匹配一個(gè)表單符

字符\n 
意義:匹配一個(gè)換行符

字符\r 
意義:匹配一個(gè)回車(chē)符

字符\s 
意義:匹配一個(gè)單個(gè)white空格符,包括空格,tab,form feed,換行符,等價(jià)于[ \f\n\r\t\v]。 
例如:/\s\w*/匹配"foo bar."中的' bar'。

字符\S 
意義:匹配除white空格符以外的一個(gè)單個(gè)的字符,等價(jià)于[^ \f\n\r\t\v]。 
例如:/\S/\w*匹配"foo bar."中的'foo'。

字符\t 
意義:匹配一個(gè)制表符

字符\v 
意義:匹配一個(gè)頂頭制表符

字符\w 
意義:匹配所有的數(shù)字和字母以及下劃線,等價(jià)于[A-Za-z0-9_]。 
例如:/\w/匹配"apple,"中的'a',"$5.28,"中的'5'和"3D."中的'3'。

字符\W 
意義:匹配除數(shù)字、字母外及下劃線外的其它字符,等價(jià)于[^A-Za-z0-9_]。 
例如:/\W/或者/[^$A-Za-z0-9_]/匹配"50%."中的'%'。

字符\n 
意義:這里的n是一個(gè)正整數(shù)。匹配一個(gè)正則表達(dá)式的最后一個(gè)子串的n的值(計(jì)數(shù)左圓括號(hào))。

例如:/apple(,)\sorange\1/匹配"apple, orange, cherry, peach."中的'apple, orange',下面有一個(gè)更加完整的例子。 
注意:如果左圓括號(hào)中的數(shù)字比\n指定的數(shù)字還小,則\n取下一行的八進(jìn)制escape作為描述。

字符\ooctal和\xhex 
意義:這里的\ooctal是一個(gè)八進(jìn)制的escape值,而\xhex是一個(gè)十六進(jìn)制的escape值,允許在一個(gè)正則表達(dá)式中嵌入ASCII碼。


當(dāng)表達(dá)式被檢查的時(shí)候,文字符號(hào)提供了編輯正則表達(dá)式的方法。利用文字符號(hào)可以使到正則表達(dá)式保持為常數(shù)。例如,如果你在一個(gè)循環(huán)中使用文字符號(hào)來(lái)構(gòu)造一個(gè)正則表達(dá)式,正則表達(dá)式不需進(jìn)行反復(fù)編譯。

正則表達(dá)式對(duì)象構(gòu)造器,例如,new RegExp("ab+c"),提供正則表達(dá)式的運(yùn)行時(shí)編譯。當(dāng)你知道正則表達(dá)式的模式會(huì)變化的時(shí)候,應(yīng)該使用構(gòu)造函數(shù),或者你不知道正則表達(dá)式的模式,而它們是從另外的源獲得的時(shí)候,比如由用戶輸入時(shí)。一旦你定義好了正則表達(dá)式,該正則表達(dá)式可在任何地方使用,并且可以改變,你可以使用編譯方法來(lái)編譯一個(gè)新的正則表達(dá)式以便重新使用。

一個(gè)分離預(yù)先定義的RegExp對(duì)象可以在每個(gè)窗口中使用;也就是說(shuō),每個(gè)分離的JavaScript線程運(yùn)行以獲得自己的RegExp對(duì)象。因?yàn)槊總€(gè)腳本在一個(gè)線程中是不可中斷的,這就確保了不同的腳本不會(huì)覆蓋RegExp對(duì)象的值。

預(yù)定義的RegExp對(duì)象包含的靜態(tài)屬性:input, multiline, lastMatch,lastParen, leftContext, rightContext, 以及從$1到$9。input和multiline屬性能被預(yù)設(shè)。其它靜態(tài)屬性的值是在執(zhí)行個(gè)別正則表達(dá)式對(duì)象的exec和test方法后,且在執(zhí)行字符串的match和replace方法后設(shè)置的。

屬性 
注意RegExp對(duì)象的幾個(gè)屬性既有長(zhǎng)名字又有短名字(象Perl)。這些名字都是指向相同的值。Perl是 
一種編程語(yǔ)言,而JavaScript模仿了它的正則表達(dá)式。

屬性$1, ..., $9 
取得匹配的子串,如果有的話

屬性$_ 
參考input

屬性$* 
參考multiline

屬性$& 
參考lastMatch

屬性$+ 
參考lastParen

屬性$` 
參考leftContext

屬性$' 
參考rightContext

屬性constructor 
指定用來(lái)建立對(duì)象原型函

屬性global 
決定是否測(cè)試正則表達(dá)式是否不能匹配所有的字符串,或者只是與最先的沖突。

屬性ignoreCase 
決定試圖匹配字符串的時(shí)候是否忽略大小寫(xiě)

屬性input 
當(dāng)正則表達(dá)式被匹配的時(shí)候,為相反的字符串。

屬性lastIndex 
決定下一次匹配從那里開(kāi)始

屬性lastMatch 
最后一個(gè)匹配的字符

屬性lastParen 
子串匹配的時(shí)候,最后一個(gè)parenthesized,如果有的話。

屬性leftContext 
最近一次匹配前的子串。

屬性multiline 
是否在串的多行中搜索。

屬性prototype 
允許附加屬性到所有的對(duì)象

屬性rightContext 
最近一次匹配后的的子串。

屬性source 
模式文本

方法 
compile方法 
編譯一個(gè)正則表達(dá)式對(duì)象

exec方法 
運(yùn)行正則表達(dá)式匹配

test方法 
測(cè)試正則達(dá)式匹配

toSource方法 
返回一個(gè)對(duì)象的文字描述指定的對(duì)象;你可以使用這個(gè)值來(lái)建立一個(gè)新的對(duì)象。不考慮Object.toS 
ource方法。

toString方法 
返回一個(gè)字符串描述指定的對(duì)象,不考慮Object.toString對(duì)象。

valueOf方法 
返回指定對(duì)角的原始值。不考慮Object.valueOf方法。

另外,這個(gè)對(duì)象繼承了對(duì)象的watch和unwatch方法


例子: 
例1、下述示例腳本使用replace方法來(lái)轉(zhuǎn)換串中的單詞。在替換的文本中,腳本使用全局 RegExp對(duì)象的$1和$2屬性的值。注意,在作為第二個(gè)參數(shù)傳遞給replace方法的時(shí)候,RegExp對(duì)象的$屬性的名稱(chēng)。 
<SCRIPT LANGUAGE="JavaScript1.2"> 
re = /(\w+)\s(\w+)/; 
str = "John Smith"; 
newstr=str.replace(re,"$2, $1"); 
document.write(newstr) 
</SCRIPT>

顯示結(jié)果:"Smith, John".

例2、下述示例腳本中,RegExp.input由Change事件處理句柄設(shè)置。在getInfo函數(shù)中,exec 方法 
使用RegExp.input的值作為它的參數(shù),注意RegExp預(yù)置了$屬性。


<SCRIPT LANGUAGE="JavaScript1.2"> 
function getInfo(abc) 

re = /(\w+)\s(\d+)/; 
re.exec(abc.value); 
window.alert(RegExp.$1 + ", your age is " + RegExp.$2); 

</SCRIPT>

  請(qǐng)輸入你的姓和年齡,輸入完后按回車(chē)鍵。 
   <FORM><INPUT TYPE="TEXT" NAME="NameAge" onChange="getInfo(this);"></FORM> 
   </HTML>


$1, ..., $9屬性 
用圓括號(hào)括著的匹配子串,如果有的話。 
是RegExp的屬性 
靜態(tài),只讀

在JavaScript 1.2, NES 3.0以上版本提供 
描述:因?yàn)閕nput是靜態(tài)屬性,不是個(gè)別正則表達(dá)式對(duì)象的屬性。你可以使用RegExp.input 訪問(wèn)該屬性。

能加上圓括號(hào)的子串的數(shù)量不受限制,但正則表達(dá)式對(duì)象只能保留最后9 條。如果你要訪問(wèn)所有的圓括號(hào)內(nèi)的匹配字串,你可以使用返回的數(shù)組。

這些屬性能用在RegExp.replace方法替換后的字符串(輸出結(jié)果)。當(dāng)使用這種方式的時(shí)候,不用預(yù) 先考慮RegExp對(duì)象。下面給出例子。當(dāng)正則表達(dá)式中沒(méi)有包含圓括號(hào)的時(shí)候,該腳本解釋成$n的字面意義。(這里的n是一個(gè)正整數(shù))。

例如: 
下例腳本使用replace 方法來(lái)交換串中單詞的位置。在替換后的文本字串中,腳本使用正則表達(dá)式 
RegExp對(duì)象的$1和$2屬性的值。注意:當(dāng)它們向replace方法傳遞參數(shù)的時(shí)候,這里沒(méi)有考慮 $ 屬性的 
RegExp對(duì)象的名稱(chēng)。 
<SCRIPT LANGUAGE="JavaScript1.2"> 
re = /(\w+)\s(\w+)/; 
str = "John Smith"; 
newstr=str.replace(re,"$2, $1"); 
document.write(newstr) 
</SCRIPT> 
顯示的輸出結(jié)果為:Smith, John。


正則表達(dá)式regular expression詳述(二)

正則表達(dá)式詳述(二)

以下這些不是正則表達(dá)式的新增對(duì)象請(qǐng)參閱對(duì)應(yīng)的JavaScript對(duì)象的屬性 $_屬性 參考input $*屬性

參考multiline $&屬性 參考lastMatch $+屬性 參考lastParen $`屬性

參考leftContext $'屬性 參考rightContext compile方法 在腳本運(yùn)行期間編譯正則表達(dá)式對(duì)象 
屬于RegExp的方法 在JavaScript 1.2, NES 3.0以上版本提供 語(yǔ)法: 
regexp.compile(pattern[, flags]) 以數(shù): regexp 正則表達(dá)式的名稱(chēng),可以是變量名或文字串。 
pattern 正則表達(dá)式的定義文本。 flags 如果指定的話,可以是下面其中的一個(gè): "g": 匹配所有可能的字串 
"i": 忽略大小寫(xiě) "gi": 匹配所有可能的字串及忽略大小寫(xiě) 描述: 
使用compile方法來(lái)編譯一個(gè)正則表達(dá)式 created with the RegExp constructor function。這樣 
就強(qiáng)制正則表達(dá)式只編譯一次,而不是每次遇到正則表達(dá)式的時(shí)候都編譯一次。當(dāng)你確認(rèn)正則表達(dá)式能 
保持不變的時(shí)候可使用compile 方法來(lái)編譯它(在獲得它的匹配模式后),這樣就可以在腳本中重復(fù)多次使用它。 
你亦可以使用compile 方法來(lái)改變?cè)谶\(yùn)行期間改變正則表達(dá)式。例如,假如正則表達(dá)式發(fā)生變化, 
你可以使用compile方法來(lái)重新編譯該對(duì)象來(lái)提高使用效率。 
使用該方法將改變正則表達(dá)式的source, global和ignoreCasesource屬性的值。 constructor 
指出建立對(duì)象原型的function。注意這個(gè)屬性的值由函數(shù)本身提供,而不是一個(gè)字串包含RegExp的name.Property提供。 
在JavaScript 1.1, NES 2.0以上版本提供 ECMA版本ECMA-262 描述:參考Object.constructor. 
exec方法 在指定的字符串運(yùn)行匹配搜索。返回一個(gè)結(jié)果數(shù)組。 是RegExp的方法 
在JavaScript 1.2, NES 3.0以上版本提供 語(yǔ)法: regexp.exec([str])regexp([str])

參數(shù): regexp,正則表達(dá)式的名稱(chēng),可以是一個(gè)變量名或文字定義串。 
str,要匹配正則表達(dá)式的字符串,如果省略,將使用RegExp.input的值。

描述:就如在語(yǔ)法描述中的一樣,正則表達(dá)工的exec方法能夠被直接調(diào)用(使用regexp.exec(str))或者間接調(diào)用(使用regexp(str))。 
假如你只是運(yùn)行以找出是否匹配,可以使用String搜索方法。 
假如匹配成功,exec方法返回一個(gè)數(shù)組并且更新正則表達(dá)式對(duì)象屬性的值和預(yù)先定義的正則表達(dá)式對(duì)象、RegExp。如果匹配失敗,exec方法返回null。

請(qǐng)看下例: <SCRIPT LANGUAGE="JavaScript1.2"> //匹配一個(gè)b接著一個(gè)或多個(gè)d,再接著一個(gè)b 
//忽略大小寫(xiě) myRe=/d(b+)(d)/ig; myArray = myRe.exec("cdbBdbsbz"); 
</SCRIPT> 下面是該腳本的返回值:對(duì)象 屬性/Index 描述 例子 
myArray

myArray的內(nèi)容 ["dbBd", "bB", "d"] 
index 
基于0的匹配index 1 
input 
原始字符串 cdbBdbsbz 
[0] 
最后匹配的字符 dbBd 
[1], ...[n] 
用圓括號(hào)括住的匹配字符串,如果有的話。不限制括號(hào)的個(gè)數(shù)。 [1] = bB 
[2] = d 
myRe 
lastIndex 
開(kāi)始下次匹配操作的index值 5 
ignoreCase 
指出"i"是否使用以忽略大小寫(xiě) true 
global 
指出是否使用"g"標(biāo)記來(lái)進(jìn)行匹配所有可能的字串 true 
source 
定義模式的文本字符串 d(b+)(d) 
RegExp 
lastMatch$& 
最后匹配的字符 dbBd 
leftContext$\Q 
最新匹配前面的子串 c 
rightContext$' 
最新匹配后面的子串 bsbz 
$1, ...$9 
圓括號(hào)內(nèi)的匹配子串,如果有的話。圓括號(hào)的個(gè)數(shù)不受限制,但RegExp只能保留最后9個(gè) $1 = bB 
$2 = d 
lastParen $+ 
最后一個(gè)加上圓括號(hào)的匹配子串,如果有的話 d

假如你的正則表達(dá)式使用了"g"標(biāo)記,你可以多次使用exec 方法來(lái)連續(xù)匹配相同的串。當(dāng)你這樣做的時(shí)候,新的匹配將從由正則表達(dá)式的lastIndex 屬性值確定的子串中開(kāi)始。例如,假定你使用下面的腳本:

<SCRIPT LANGUAGE="JavaScript1.2"> myRe=/ab*/g;str = "abbcdefabh" 
myArray = myRe.exec(str); 
document.writeln("Found "+myArray[0]+". Next match starts at "+myRe.lastIndex) 
mySecondArray = myRe.exec(str); 
document.writeln("Found "+mySecondArray[0]+". Next match starts at "+myRe.lastIndex)
</SCRIPT>

這個(gè)腳本顯示如下結(jié)果: Found abb. Next match starts at 3 
Found ab. Next match starts at 9 例子:

在下面的例子中,用戶輸入一個(gè)名字,腳本根據(jù)輸入執(zhí)行匹配操作。接著檢查數(shù)組看是否和其它用戶的名字匹配。 
本腳本假定已注冊(cè)的用戶的姓已經(jīng)存進(jìn)了數(shù)組A中,或許從一個(gè)數(shù)據(jù)庫(kù)中取得。

<HTML> 
<SCRIPT LANGUAGE="JavaScript1.2"> A = ["zhao","qian","sun","li","liang"] 
function lookup() { firstName = /\w+/i(); if (!firstName) 
window.alert (RegExp.input + "非法輸入"); else { count=0; 
for (i=0;i 輸入你的姓然后按回車(chē)鍵。 
<FORM><INPUT TYPE:"TEXT" NAME="FirstName" onChange="lookup(this);"></FORM> 
</HTML>

global屬性 正則表達(dá)式中是否使用了"g"標(biāo)記。 RegExp屬性,只讀 
在JavaScript 1.2, NES 3.0以上版本提供 描述: global是一個(gè)個(gè)別正則表達(dá)式對(duì)象的屬性 
如果使用了"g"標(biāo)記,global的值為true;否則為 false。"g"標(biāo)記指定正則表達(dá)式測(cè)試所有可能的匹配。 
你不能直接改變?cè)搶傩缘闹?,但可以調(diào)用compile方法來(lái)改變它。 ignoreCase 檢查正則表達(dá)式是否使用了"i"標(biāo)記 
RegExp屬性,只讀 在JavaScript 1.2, NES 3.0以上版本提供 描述: 
ignoreCase是個(gè)別正則表達(dá)式對(duì)象的一個(gè)屬性。 
如果使用了"i"標(biāo)記,則返回true,否則返回false。"i"標(biāo)記指示在進(jìn)行匹配的時(shí)候忽略大小寫(xiě)。 
你不能直接改變?cè)搶傩缘闹担梢酝ㄟ^(guò)調(diào)用compile方法來(lái)改變它 input 指出正則表達(dá)式要測(cè)試那個(gè)字串。$_是這個(gè)屬性的另一個(gè)名字。 
RegExp的屬性,靜態(tài) 在JavaScript 1.2, NES 3.0以上版本提供

描述:因?yàn)閕nput是靜態(tài)的,不是某個(gè)個(gè)別的正則表達(dá)式對(duì)象的屬性。你也可以使用 RegExp.input來(lái)表示。 
如果沒(méi)有給正則表達(dá)式的exec或test方法提供字符串,并且RegExp.input中有值,則使用它的值來(lái)調(diào)用該方法。 
腳本或?yàn)g覽器能夠預(yù)置input屬性。如果被預(yù)置了值且調(diào)用exec或 test方法的時(shí)候沒(méi)有提供字符串 
則調(diào)用exec或test的時(shí)候使用input的值。input可以被瀏覽器以下面的方式設(shè)置: 
當(dāng)text表單域處理句柄被調(diào)用的時(shí)候,input被設(shè)置為該text輸入的字串。 
當(dāng)textarea表單域處理句柄被調(diào)用的時(shí)候,input被設(shè)置為textarea域內(nèi)輸入的字串。注意multili 
ne亦被設(shè)置成true從而能匹配多行文本。 當(dāng)select表單域處理句柄被調(diào)用的時(shí)候,input被設(shè)置成selected text的值。 
當(dāng)鏈接對(duì)象的處理句柄被調(diào)用的時(shí)候,input被設(shè)置成<A HREF=...>和</A>之間的字符串。 
事件理現(xiàn)句柄處理完畢后,input屬性的值被清除。 lastIndex 可讀/可寫(xiě)的一個(gè)整數(shù)屬性,指出下一次匹配從哪里開(kāi)始。 
RegExp的屬性 在JavaScript 1.2, NES 3.0以上版本提供

描述:lastIndex 是個(gè)別的正則表達(dá)式對(duì)象的屬性。 這個(gè)屬性只有當(dāng)正則表達(dá)式的"g"標(biāo)記被使用以進(jìn)行全串匹配的時(shí)候才被設(shè)置。實(shí)行以下規(guī)則:

如果lastIndex大小字符串的長(zhǎng)度,regexp.test和regexp.exec失敗,且lastIndex被設(shè)為0。

如果lastIndex等于字串的長(zhǎng)度且正則表達(dá)式匹配空字符串,則正則表達(dá)式從lastIndex的位置開(kāi)始匹配。

如果lastIndex等于字符串的長(zhǎng)度且正則表達(dá)式不匹配空字符串,則正則表達(dá)式不匹配input,且lastIndex被置為0。

否則,lastIndex被設(shè)置成最近一次匹配的下一點(diǎn)。 例如,按下面的順序執(zhí)行腳本: re = /(hi)?/g 匹配空字符串 
re("hi") 返回["hi", "hi"],lastIndex置為2 
re("hi") 返回[""],一個(gè)空數(shù)組,它的下標(biāo)為0的元素就是匹配字符串。在這種情況下,返回空 
串是因?yàn)閘astIndex等于2(且仍然是2),并且"hi"的長(zhǎng)度也是2。 lastMatch 最后一次匹配字符串,$&是同樣的意思。 
RegExp的屬性,靜態(tài),只讀 在JavaScript 1.2, NES 3.0以上版本提供

描述:因?yàn)閘astMatch是靜態(tài)的,所以它不是個(gè)別指定正則表達(dá)式的屬性。你也可以使用RegExp.lastMatch。 lastParen 
最后一次加上括號(hào)的匹配字符串,如果有的話。$+是同樣的意思。 RegExp屬性,靜態(tài),只讀 
在JavaScript 1.2, NES 3.0以上版本提供

描述:因?yàn)閘astParen是靜態(tài)的,它不是某個(gè)個(gè)別正則式的屬性,你可以使用RegExp.lastParen 表達(dá)同樣的意思。 
leftContext 最近一次匹配前面的子串,$`具有相同的意思。 RegExp的屬性,靜態(tài),只讀 
在JavaScript 1.2, NES 3.0以上版本提供

描述:因?yàn)閘eftContext是靜態(tài)的,不是某一個(gè)正則表達(dá)式的屬性,所以可以使用RegExp.leftContext來(lái)表達(dá)想同的意思。 
multiline 反映是否匹配多行文本,$*是相同的意思。 RegExp的屬性,靜態(tài) 
在JavaScript 1.2, NES 3.0以上版本提供

描述:因?yàn)閙ultiline是靜態(tài)的,而不是某個(gè)個(gè)別正則表達(dá)式的屬性,所以能夠用RegExp.multiline表達(dá)相同的意思。 
如果允許匹配多行文本,則multiline為true,如果搜索必須在換行時(shí)停止,則為false。 
腳本或?yàn)g覽器能夠設(shè)置multiline屬性。當(dāng)一個(gè)textarea的事件處理句柄被調(diào)用的時(shí)候,multiline 
被置為true。在事件處理句柄處理完畢后,multiline屬性值被清除。也就是說(shuō),如果你設(shè)置了multiline為true,則執(zhí)行任何的事件處理句柄后,multiline被置為false。 prototype 
描繪類(lèi)的原型。你可以根據(jù)要求使用prototype來(lái)增加類(lèi)的屬性或方法。為了獲得prototypes 的資料,請(qǐng)參閱RegExp的Function.prototype.Property屬性。 從JavaScript 1.1, NES 2.0版本開(kāi)始提供 
ECMA版本ECMA-262 rightContext 最后一次匹配的右邊的字符串,$'是同樣的效果。 
RegExp的屬性,靜態(tài),只讀 從 JavaScript 1.2, NES 3.0以上版本開(kāi)始提供

描述:因?yàn)閞ightContext是靜態(tài)的,不是某個(gè)個(gè)別正則表達(dá)工的屬性,可以使用RegExp.rightContext來(lái)達(dá)到相同的效果。 
source 一個(gè)只讀屬性,包含正則表達(dá)式定義的模式,不包僑forward slashes和"g"或"i"標(biāo)記。 RegExp的屬性,只讀 
從JavaScript 1.2, NES 3.0以上版本開(kāi)始提供

描述:source是個(gè)別正則表達(dá)式對(duì)象的屬性,你不能直接改變它的值,但可以通過(guò)調(diào)用compile 方法來(lái)改變它。 test 
執(zhí)行指定字符串的正則表達(dá)式匹配搜索,返回true或false。 RegExp的方法 
從JavaScript 1.2, NES 3.0以上版本開(kāi)始提供 語(yǔ)法:regexp.test([str])

參數(shù):regexp,正則表達(dá)式的名稱(chēng),可以是變量名或正則表達(dá)式定義文字串 
str,要匹配的字符串,如果省略,將使用RegExp.input的值為作參數(shù)

描述:當(dāng)你需要知道一個(gè)字符串能否匹配某個(gè)正則表達(dá)工,可以使用test方法(與String.search方 
法類(lèi)似); 為了獲得更多的信息(但速度將變慢),可以使用exec方法(與String.match方法類(lèi)似)。 例子:下面的例子顯示test是否成功的提示:

function testinput(re, str){ 
if (re.test(str)) midstring = " contains "; 
else midstring = " does not contain "; 
document.write (str + midstring + re.source); } toSource

返回一個(gè)字符串象征對(duì)象的源碼 RegExp的方法 從JavaScript 1.3以上版本開(kāi)始提供 語(yǔ)法:toSource()

參數(shù):沒(méi)有 描述:toSource方法返回下述的值: 對(duì)于內(nèi)置的RegExp對(duì)象,toSource返回下面的字符象征源碼不可用: 
function Boolean(){ [native code] } 
在RegExp場(chǎng)合中, toSource返回象征源碼的字符串,通常這個(gè)方法是由JavaScript內(nèi)部自動(dòng)調(diào)用而不是不代碼中顯式調(diào)用。 
更多請(qǐng)看Object.toSource toString 返回描繪指定對(duì)象的字符串。 RegExp的方法 
從JavaScript 1.1, NES 2.0開(kāi)始提供 ECMA版本ECMA-262 語(yǔ)法:toString() 參數(shù):無(wú)

描述:RegExp對(duì)象不考慮Object對(duì)象的toString方法;它不繼承Object.toString,對(duì)于RegExp 對(duì) 
象,toString方法返回一個(gè)代表該對(duì)象的字符串。 例如:下面的例子顯示象征RegExp對(duì)象的字符串 
myExp = new RegExp("a+b+c"); alert(myExp.toString()) 
displays "/a+b+c/" 更多請(qǐng)看:Object.toString valueOf 返回一個(gè)RegExp對(duì)象的原始值 
RegExp的方法 從JavaScript 1.1版本開(kāi)始提供 ECMA版本:ECMA-262 語(yǔ)法:valueOf()

參數(shù):無(wú) 描述:RegExp的valueOf方法以字符串形式返回RegExp對(duì)象的原始值,這個(gè)值與RegExp.toString相等。 
該方法通常由JavaScript內(nèi)部自動(dòng)調(diào)用而不是顯式調(diào)用 例子: myExp = new RegExp("a+b+c"); 
alert(myExp.valueOf()) displays "/a+b+c/"


正則表達(dá)式在javascript中的幾個(gè)實(shí)例1(轉(zhuǎn))

! 去除字符串兩端空格的處理

如果采用傳統(tǒng)的方式,就要可能就要采用下面的方式了 

代碼如下:

//清除左邊空格 
function js_ltrim(deststr) 

if(deststr==null)return ""; 
var pos=0; 
var retStr=new String(deststr); 
if (retStr.lenght==0) return retStr; 
while (retStr.substring(pos,pos+1)==" ") pos++; 
retStr=retStr.substring(pos); 
return(retStr); 

//清除右邊空格 
function js_rtrim(deststr) 

if(deststr==null)return ""; 
var retStr=new String(deststr); 
var pos=retStr.length; 
if (pos==0) return retStr; 
while (pos && retStr.substring(pos-1,pos)==" " ) pos--; 
retStr=retStr.substring(0,pos); 
return(retStr); 

//清除左邊和右邊空格 
function js_trim(deststr) 

if(deststr==null)return ""; 
var retStr=new String(deststr); 
var pos=retStr.length; 
if (pos==0) return retStr; 
retStr=js_ltrim(retStr); 
retStr=js_rtrim(retStr); 
return retStr; 


采用正則表達(dá)式,來(lái)去除兩邊的空格,只需以下代碼 
String.prototype.trim = function() 

return this.replace(/(^\s*)|(\s*$)/g, ""); 
}

一句就搞定了, 
可見(jiàn)正則表達(dá)式為我們節(jié)省了相當(dāng)?shù)木帉?xiě)代碼量


! 移動(dòng)手機(jī)號(hào)的校驗(yàn)

如果采用傳統(tǒng)的校驗(yàn)方式至少就要完成下面三步的校驗(yàn),

(1). 是否是數(shù)字

(2).是否是11位

(3).數(shù)字的第三位是否是5,6,7,8,9

如果采用正則表達(dá)式校驗(yàn),只需以下代碼 

代碼如下:

function checkMobile1(form) 

if (form.mobile.value > "") 

var reg=/13[5,6,7,8,9]\d{8}/; 
if ( form.mobile.value.match(reg)== null) 

alert("請(qǐng)輸入正確的移動(dòng)手機(jī)號(hào)碼!"); 
form.mobile.focus(); return false; 


return true; 


從上面的代碼可以看出校驗(yàn)移動(dòng)手機(jī)號(hào)只需定義一個(gè)var reg=/13[5,6,7,8,9]\d{8}/;模式匹配串就可以完成合法性校驗(yàn)了

! URL的校驗(yàn), 
條件:必須以http:// 或 https:// 開(kāi)頭, 端口號(hào)必須為在1-65535 之間, 以下代碼完成了合法性校驗(yàn) 

代碼如下:

//obj:數(shù)據(jù)對(duì)象 
//dispStr :失敗提示內(nèi)容顯示字符串 
function checkUrlValid( obj, dispStr) 

if(obj == null) 

alert("傳入對(duì)象為空"); 
return false; 

var str = obj.value;

var urlpatern0 = /^https?:\/\/.+$/i; 
if(!urlpatern0.test(str)) 

alert(dispStr+"不合法:必須以'http:\/\/'或'https:\/\/'開(kāi)頭!"); 
obj.focus(); 
return false; 
}

var urlpatern2= /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?.+$/i; 
if(!urlpatern2.test(str)) 

alert(dispStr+"端口號(hào)必須為數(shù)字且應(yīng)在1-65535之間!"); 
obj.focus(); 
return false; 
}


var urlpatern1 =/^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i;

if(!urlpatern1.test(str)) 

alert(dispStr+"不合法,請(qǐng)檢查!"); 
obj.focus(); 
return false; 
}

var s = "0"; 
var t =0; 
var re = new RegExp(":\\d+","ig"); 
while((arr = re.exec(str))!=null) 

s = str.substring(RegExp.index+1,RegExp.lastIndex);

if(s.substring(0,1)=="0") 

alert(dispStr+"端口號(hào)不能以0開(kāi)頭!"); 
obj.focus(); 
return false; 
}

t = parseInt(s); 
if(t<1 || t >65535) 

alert(dispStr+"端口號(hào)必須為數(shù)字且應(yīng)在1-65535之間!"); 
obj.focus(); 
return false; 


return true; 


對(duì)url的校驗(yàn),看上去有很多的代碼,這是因?yàn)橐o予出錯(cuò)提示, 否則只需var urlpatern1 =/^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i; 一句就可以校驗(yàn)出url合法性了


正則表達(dá)式在JavaScript應(yīng)用 

--------------------------------------------------------------
去掉字符串頭尾多余的空格 
/g是全文查找所有匹配

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

function String.prototype.LTrim(){return this.replace(/(^\s*)/g, "");}

function String.prototype.RTrim(){return this.replace(/(\s*$)/g, "");}

-------------------------------------------------------------- 
應(yīng)用:計(jì)算字符串的長(zhǎng)度(一個(gè)雙字節(jié)字符長(zhǎng)度計(jì)2,ASCII字符計(jì)1)

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

-------------------------------------------------------------- 
應(yīng)用:javascript中沒(méi)有像vbscript那樣的trim函數(shù),我們就可以利用這個(gè)表達(dá)式來(lái)實(shí)現(xiàn),如下:

String.prototype.trim = function() 

return this.replace(/(^\s*)|(\s*$)/g, ""); 

得用正則表達(dá)式從URL地址中提取文件名的javascript程序,如下結(jié)果為page1

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

##利用正則表達(dá)式限制網(wǎng)頁(yè)表單里的文本框輸入內(nèi)容:

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

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

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

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

用正則表達(dá)式和javascript對(duì)表單進(jìn)行全面驗(yàn)證 

使用時(shí)請(qǐng)將下面的javascript代碼存到一個(gè)單一的js文件中。

1、表單要求 
<form name="formname" onSubmit="return validateForm(this)"></form> 
將對(duì)表單中的所有以下類(lèi)型的域依次驗(yàn)證,所有驗(yàn)證是去除了前導(dǎo)和后綴空格的,要注意是區(qū)分大小寫(xiě)的。

2、空值驗(yàn)證 
表單中任意域加上emptyInfo屬性將對(duì)此域是否為空進(jìn)行驗(yàn)證(可以和最大長(zhǎng)度驗(yàn)證\一般驗(yàn)證方式同時(shí)使用)。 
無(wú)此屬性視為此域允許空值。 
如:<input type="text" name="fieldNamename" emptyInfo="字段不能為空!">

3、最大長(zhǎng)度驗(yàn)證(可以和空值驗(yàn)證、一般驗(yàn)證方式同時(shí)使用): 
<input type="text" name="fieldNamename" maxlength="20" lengthInfo="最大長(zhǎng)度不能超過(guò)20!"> 
或,<textarea maxlength="2000" lengthInfo="最大長(zhǎng)度不能超過(guò)2000!">

3、一般驗(yàn)證方式(不對(duì)空值做驗(yàn)證): 
如:<input type="text" validator="^(19|20)[0-9]{2}$" errorInfo="不正確的年份!" >

4、標(biāo)準(zhǔn)驗(yàn)證(不與其它驗(yàn)證方式同時(shí)使用): 
全部通過(guò)<input type="hidden">來(lái)實(shí)現(xiàn),并且不需要name屬性以免提交到服務(wù)器。

4.1、合法日期驗(yàn)證: 
<input type="text" name="yearfieldName" value="2004">注:這里也可以是<select name="yearfieldName"></select>,以下同
<input type="text" name="monthfieldName" value="02"> 
<input type="text" name="dayfieldName" value="03"> 
<input type="hidden" validatorType="DateGroup" year="yearfieldName" month="monthfieldName" day="dayfieldName" errorInfo="不正確的日期!">
yearfieldName、monthfieldName、dayfieldName分別為年月日字段,月和日可以是兩位(MM)或一位格式(M), 
此處不對(duì)每個(gè)字段分別檢驗(yàn)(如果要檢驗(yàn),請(qǐng)?jiān)谀暝氯杖齻€(gè)域分別使用前面的一般驗(yàn)證方式),只對(duì)日期的最大值是否合法檢查;

4.2、日期格式驗(yàn)證(請(qǐng)注意,此驗(yàn)證不對(duì)日期是否有效進(jìn)行驗(yàn)證,還未找到從格式中得到年月日數(shù)據(jù)的方法^_^): 
<input type="text" name="datefieldName" value="2003-01-03 21:31:00"> 
<input type="hidden" validatorType="Date" fieldName="datefieldName"; format="yyyy-MM-dd HH:mm:ss" errorInfo="不正確的日期!">
其中格式僅對(duì)y、M、d、H、m、s進(jìn)行支持(其它字符視為非時(shí)間的字符)

4.3、列表驗(yàn)證: 
檢驗(yàn)列表(checkbox、redio、select)是否至少選中了一條記錄(對(duì)select主要用于多項(xiàng)選擇) 
<input type="checkbox" name="checkbox1"> 
<input type="hidden" validatorType="Checkbox" fieldName="checkbox1" errorInfo="請(qǐng)至少選中一條記錄!">
其中validatorType可以是Checkbox、R、Select; 
對(duì)于一個(gè)select表單,如果要求選擇一條不能是第一條的記錄,請(qǐng)用下列方式: 
<select name="select1" emptyInfo="請(qǐng)選擇一個(gè)選項(xiàng)!"> 
<option value="">==請(qǐng)選擇==</option> 
<option value="1">1</option> 
<select>

4.4、Email驗(yàn)證: 
<input type="text" name="email"> 
<input type="hidden" fieldName="email" validatorType="Email" separator="," errorInfo="不正確的Email!">
其中separator為可選項(xiàng),表示輸入多個(gè)email時(shí)的分隔符(無(wú)此選項(xiàng)只能是一個(gè)地址)

4.5、加入其它javascript操作: 
<script type="text/javascript"> 
function functionname(){ 
自定義方法 

</script> 
表單中加入<input type="hidden" validatorType="javascript" functionName="functionname">(此時(shí)emptyInfo等屬性無(wú)效)
時(shí)將調(diào)用function屬性中指定的javascript方法(要求方法返回true或false,返回false將不再驗(yàn)證表單,也不提交表單)。

5、在表單通過(guò)驗(yàn)證提交前disable一個(gè)按鈕(也可將其它域disable,不能與其它驗(yàn)證同在一個(gè)域),不要求按鈕是表單中的最后一個(gè) 
<input type="button" name="提交" validatorType="disable">

6、不驗(yàn)證表單 
<input type="hidden" name="validate" value="0" functionName="functionname"> 
當(dāng)validator域值為0時(shí)不對(duì)表單進(jìn)行驗(yàn)證,直接提交表單或執(zhí)行指定function并返回true后提交表單 
functionName為可選 

代碼如下:

<script type="text/javascript"> 
function getStringLength(str){ 
var endvalue=0; 
var sourcestr=new String(str); 
var tempstr; 
for (var strposition = 0; strposition < sourcestr.length; strposition ++) { 
tempstr=sourcestr.charAt(strposition); 
if (tempstr.charCodeAt(0)>255 || tempstr.charCodeAt(0)<0) { 
endvalue=endvalue+2; 
} else { 
endvalue=endvalue+1; 


return(endvalue); 

function trim(str){ 
if(str==null) return ""; 
if(str.length==0) return ""; 
var i=0,j=str.length-1,c; 
for(;i<str.length;i++){ 
c=str.charAt(i); 
if(c!=' ') break; 

for(;j>-1;j--){ 
c=str.charAt(j); 
if(c!=' ') break; 

if(i>j) return ""; 
return str.substring(i,j+1); 

function validateDate(date,format,alt){ 
var time=trim(date.value); 
if(time=="") return; 
var reg=format; 
var reg=reg.replace(/yyyy/,"[0-9]{4}"); 
var reg=reg.replace(/yy/,"[0-9]{2}"); 
var reg=reg.replace(/MM/,"((0[1-9])|1[0-2])"); 
var reg=reg.replace(/M/,"(([1-9])|1[0-2])"); 
var reg=reg.replace(/dd/,"((0[1-9])|([1-2][0-9])|30|31)"); 
var reg=reg.replace(/d/,"([1-9]|[1-2][0-9]|30|31))"); 
var reg=reg.replace(/HH/,"(([0-1][0-9])|20|21|22|23)"); 
var reg=reg.replace(/H/,"([0-9]|1[0-9]|20|21|22|23)"); 
var reg=reg.replace(/mm/,"([0-5][0-9])"); 
var reg=reg.replace(/m/,"([0-9]|([1-5][0-9]))"); 
var reg=reg.replace(/ss/,"([0-5][0-9])"); 
var reg=reg.replace(/s/,"([0-9]|([1-5][0-9]))"); 
reg=new RegExp("^"+reg+"$"); 
if(reg.test(time)==false){//驗(yàn)證格式是否合法 
alert(alt); 
date.focus(); 
return false; 

return true; 

function validateDateGroup(year,month,day,alt){ 
var array=new Array(31,28,31,30,31,30,31,31,30,31,30,31); 
var y=parseInt(year.value); 
var m=parseInt(month.value); 
var d=parseInt(day.value); 
var maxday=array[m-1]; 
if(m==2){ 
if((y%4==0&&y%100!=0)||y%400==0){ 
maxday=29; 


if(d>maxday){ 
alert(alt); 
return false; 

return true; 

function validateCheckbox(obj,alt){ 
var rs=false; 
if(obj!=null){ 
if(obj.length==null){ 
return obj.checked; 

for(i=0;i<obj.length;i++){ 
if(obj[i].checked==true){ 
return true; 



alert(alt); 
return rs; 

function validateRadio(obj,alt){ 
var rs=false; 
if(obj!=null){ 
if(obj.length==null){ 
return obj.checked; 

for(i=0;i<obj.length;i++){ 
if(obj[i].checked==true){ 
return true; 



alert(alt); 
return rs; 

function validateSelect(obj,alt){ 
var rs=false; 
if(obj!=null){ 
for(i=0;i<obj.options.length;i++){ 
if(obj.options[i].selected==true){ 
return true; 



alert(alt); 
return rs; 

function validateEmail(email,alt,separator){ 
var mail=trim(email.value); 
if(mail=="") return; 
var em; 
var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/; 
if(separator==null){ 
if(myReg.test(email.value)==false){ 
alert(alt); 
email.focus(); 
return false; 


else{ 
em=email.value.split(separator); 
for(i=0;i<em.length;i++){ 
em[i]=em[i].trim(); 
if(em[i].length>0&&myReg.test(em[i])==false){ 
alert(alt); 
email.focus(); 
return false; 



return true; 

function validateForm(theForm){// 若驗(yàn)證通過(guò)則返回true 
var disableList=new Array(); 
var field = theForm.elements; // 將表單中的所有元素放入數(shù)組 
for(var i = 0; i < field.length; i++){ 
var vali=theForm.validate; 
if(vali!=null){ 
if(vali.value=="0"){ 
var fun=vali.functionName; 
if(fun!=null){ 
return eval(fun+"()"); 

else{ 
return true; 


}

var empty=false; 
var value=trim(field[i].value); 
if(value.length==0){//是否空值 
empty=true; 

var emptyInfo=field[i].emptyInfo;//空值驗(yàn)證 
if(emptyInfo!=null&&empty==true){ 
alert(emptyInfo); 
field[i].focus(); 
return false; 

var lengthInfo=field[i].lengthInfo;//最大長(zhǎng)度驗(yàn)證 
if(lengthInfo!=null&&getStringLength(value)>field[i].maxLength){ 
alert(lengthInfo); 
field[i].focus(); 
return false; 
}

var validatorType=field[i].validatorType; 
if(validatorType!=null){//其它javascript 
var rs=true; 
if(validatorType=="javascript"){ 
eval("rs="+field[i].functionName+"()"); 
if(rs==false){ 
return false; 

else{ 
continue; 


else if(validatorType=="disable"){//提交表單前disable的按鈕 
disableList.length++; 
disableList[disableList.length-1]=field[i]; 
continue; 

else if(validatorType=="Date"){ 
rs=validateDate(theForm.elements(field[i].fieldName),field[i].format,field[i].errorInfo);

else if(validatorType=="DateGroup"){ 
rs=validateDateGroup(theForm.elements(field[i].year),theForm.elements(field[i].month),theForm.elements(field[i].day),field[i].errorInfo);

else if(validatorType=="Checkbox"){ 
rs=validateCheckbox(theForm.elements(field[i].fieldName),field[i].errorInfo); 

else if(validatorType=="Radio"){ 
rs=validateRadio(theForm.elements(field[i].fieldName),field[i].errorInfo); 

else if(validatorType=="Select"){ 
rs=validateSelect(theForm.elements(field[i].fieldName),field[i].errorInfo); 

else if(validatorType=="Email"){ 
rs=validateEmail(theForm.elements(field[i].fieldName),field[i].errorInfo); 

else{ 
alert("驗(yàn)證類(lèi)型不被支持, fieldName: "+field[i].name); 
return false; 

if(rs==false){ 
return false; 


else{//一般驗(yàn)證 
if(empty==false){ 
var v = field[i].validator; // 獲取其validator屬性 
if(!v) continue; // 如果該屬性不存在,忽略當(dāng)前元素 
var reg=new RegExp(v); 
if(reg.test(field[i].value)==false){ 
alert(field[i].errorInfo); 
field[i].focus(); 
return false; 




for(i=0;i<disableList.length;i++){ 
disableList[i].disabled=true; 

return true; 

</script>


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)