天天看點

正規表達式中的特殊字元正規表達式在javascript中的幾個執行個體1(轉)

字元 含意
\

做為轉意,即通常在"\"後面的字元不按原來意義解釋,如/b/比對字元"b",當b前面加了反斜杆後/\b/,轉意為比對一個單詞的邊界。

-或-

對正規表達式功能字元的還原,如"*"比對它前面元字元0次或多次,/a*/将比對a,aa,aaa,加了"\"後,/a\*/将隻比對"a*"。

^ 比對一個輸入或一行的開頭,/^a/比對"an A",而不比對"An a"
$ 比對一個輸入或一行的結尾,/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),比對這個集合中的任一一個字元(或元字元)
[^xyz] 不比對這個集合中的任何一個字元
[\b] 比對一個倒退符
\b 比對一個單詞的邊界
\B 比對一個單詞的非邊界
\cX 這兒,X是一個控制符,/\cM/比對Ctrl-M
\d 比對一個字數字元,/\d/ = /[0-9]/
\D 比對一個非字數字元,/\D/ = /[^0-9]/
\n 比對一個換行符
\r 比對一個回車符
\s 比對一個空白字元,包括\n,\r,\f,\t,\v等
\S 比對一個非空白字元,等于/[^\n\f\r\t\v]/
\t 比對一個制表符
\v 比對一個重直制表符
\w 比對一個可以組成單詞的字元(alphanumeric,這是我的意譯,含數字),包括下劃線,如[\w]比對"$5.98"中的5,等于[a-zA-Z0-9]
\W 比對一個不可以組成單詞的字元,如[\W]比對"$5.98"中的$,等于[^a-zA-Z0-9]。

用re = new RegExp("pattern",["flags"]) 的方式比較好

pattern : 正規表達式

flags: g (全文查找出現的所有 pattern)

i (忽略大小寫)

m (多行查找)

vaScript動态正規表達式問題

請問正規表達式可以動态生成嗎?

例如JavaScript中:

var str = "strTemp";

要生成:

var re = /strTemp/;

如果是字元連接配接:

var re = "/" + str + "/"即可

但是要生成表達式,可以實作嗎?怎樣實作?

[JAVA] javascript 正規表達式

秋雨葉 發表于 2004-12-9 14:54:13

正規表達式是一個描述字元模式的對象。

JavaScript的RegExp對象和String對象定義了使用正規表達式來執行強大的模式比對和文字檢索與替換函數的方法.

在JavaScript中,正規表達式是由一個RegExp對象表示的.當然,可以使用一個RegExp()構造函數來建立RegExp對象,

也可以用JavaScript 1.2中的新添加的一個特殊文法來建立RegExp對象.就像字元串直接量被定義為包含在引号内的字元一樣,

正規表達式直接量也被定義為包含在一對斜杠(/)之間的字元.是以,JavaScript可能會包含如下的代碼:

var pattern = /s$/;

這行代碼建立一個新的RegExp對象,并将它賦給變量parttern.這個特殊的RegExp對象和所有以字母"s"結尾的字元串都比對.用RegExp()也可以定義

一個等價的正規表達式,代碼如下:

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

無論是用正規表達式直接量還是用構造函數RegExp(),建立一個RegExp對象都是比較容易的.較為困難的任務是用正規表達式文法來描述字元的模式.

JavaScript采用的是Perl語言正規表達式文法的一個相當完整的子集.

正規表達式的模式規範是由一系列字元構成的.大多數字元(包括所有字母數字字元)描述的都是按照字面意思進行比對的字元.這樣說來,正規表達式/java/就和

所有包含子串 "java" 的字元串相比對.雖然正規表達式中的其它字元不是按照字面意思進行比對的,但它們都具有特殊的意義.正規表達式 /s$/ 包含兩個字元.

第一個特殊字元 "s" 是按照字面意思與自身相比對.第二個字元 "$" 是一個特殊字元,它所比對的是字元串的結尾.是以正規表達式 /s$/ 比對的就是以字母 "s" 結尾

的字元串.

1.直接量字元

我們已經發現了,在正規表達式中所有的字母字元和數字都是按照字面意思與自身相比對的.JavaScript的正規表達式還通過以反斜杠(\)開頭的轉義序列支援某些非

字母字元.例如,序列 "\n" 在字元串中比對的是一個直接量換行符.在正規表達式中,許多标點符号都有特殊的含義.下面是這些字元和它們的含義:

正規表達式的直接量字元

字元 比對

________________________________

字母數字字元 自身

\ f 換頁符

\ n 換行符

\ r 回車

\ t 制表符

\ v 垂直制表符

\ / 一個 / 直接量

\ \ 一個 \ 直接量

\ . 一個 . 直接量

\ * 一個 * 直接量

\ + 一個 + 直接量

\ ? 一個 ? 直接量

\ | 一個 | 直接量

\ ( 一個 ( 直接量

\ ) 一個 ) 直接量

\ [ 一個 [ 直接量

\ ] 一個 ] 直接量

\ { 一個 { 直接量

\ } 一個 } 直接量

\ XXX 由十進制數 XXX 指 定的ASCII碼字元

\ Xnn 由十六進制數 nn 指定的ASCII碼字元

\ cX 控制字元^X. 例如, \cI等價于 \t, \cJ等價于 \n

___________________________________________________

如果想在正規表達式中使用特殊的标點符号,必須在它們之前加上一個 "\" .

2.字元類

将單獨的直接符放進中括号内就可以組合成字元類.一個字元類和它所包含的任何一個字元都比對,是以正規表達式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一個

都比對.另外還可以定義否定字元類,這些類比對的是除那些包含在中括号之内的字元外的所有字元.定義否定字元尖時,要将一個 ^ 符号作為從左中括号算起的第

一個字元.正規表達式的集合是 / [a-zA-z0-9] / .

由于某些字元類非常常用,是以JavaScript的正規表達式文法包含一些特殊字元和轉義序列來表示這些常用的類.例如, \s 比對的是空格符,制表符和其它空白符, \s

比對的則是空白符之外的任何字元.

正則表灰式的字元類

字元 比對

____________________________________________________

[...] 位于括号之内的任意字元

[^...] 不在括号之中的任意字元

. 除了換行符之外的任意字元,等價于[^\n]

\w 任何單字字元, 等價于[a-zA-Z0-9]

\W 任何非單字字元,等價于[^a-zA-Z0-9]

\s 任何空白符,等價于[\ t \ n \ r \ f \ v]

\S 任何非空白符,等價于[^\ t \ n \ r \ f \ v]

\d 任何數字,等價于[0-9]

\D 除了數字之外的任何字元,等價于[^0-9]

[\b] 一個倒退直接量(特例)

________________________________________________________________

3.複制

用以上的正則表式的文法,可以把兩位數描述成 / \ d \ d /,把四位數描述成 / \d \ d \ d \ d /.但我們還沒有一種方法可以用來描述具有任意多數位的數字或者是一個

字元串.這個串由三個字元以及跟随在字母之後的一位數字構成.這些複雜的模式使用的正規表達式文法指定了該表達式中每個元素要重複出現的次數.

指定複制的字元總是出現在它們所作用的模式後面.由于某種複制類型相當常用.是以有一些特殊的字元專門用于表示它們.例如: +号比對的就是複制前一模式一次

或多次的模式.下面的表列出了複制文法.先看一個例子:

/\d{2, 4}/ //比對2到4間的數字.

/\w{3} \d?/ //比對三個單字字元和一個任意的數字.

/\s+java\s+/ //比對字元串"java" ,并且該串前後可以有一個或多個空格.

/[^"] * / //比對零個或多個非引号字元.

正規表達式的複制字元

字元 含義

__________________________________________________________________

{n, m} 比對前一項至少n次,但是不能超過m次

{n, } 比對前一項n次,或者多次

{n} 比對前一項恰好n次

? 比對前一項0次或1次,也就是說前一項是可選的. 等價于 {0, 1}

+ 比對前一項1次或多次,等價于{1,}

* 比對前一項0次或多次.等價于{0,}

___________________________________________________________________

4.選擇,分組和引用

正規表達式的文法還包括指定選擇項,對子表達式分組和引用前一子表達式的特殊字元.字元| 用于分隔供選擇的字元.例如: /ab|cd|ef/ 比對的是字元串 "ab",或者是

字元串 "cd",又或者 "ef". /\d{3}|[a-z]{4}/ 比對的是要麼是一個三位數,要麼是四個小寫字母.在正規表達式中括号具有幾種作用.它的主要作用是把單獨的項目分組

成子表達式,以便可以像處理一個獨立的單元那種用 *、+或? 來處理那些項目.例如: /java(script) ?/ 比對的是字元串 "java",其後既可以有 "script",也可以沒有. /

(ab|cd) + |ef) / 比對的既可以是字元串 "ef",也可以是字元串"ab" 或者 "cd" 的一次或多次重複.

在正規表達式中,括号的第二個用途是在完整的模式中定義子模式。當一個正規表達式成功地和目标字元串相比對時,可以從目标串中抽出和括号中的子模式相比對

的部分.例如,假定我們正在檢索的模式是一個或多個字母後面跟随一位或多位數字,那麼我們可以使用模式 / [a-z] + \ d+/.但是由于假定我們真正關心的是每個比對

尾部的數字,那麼如果我們将模式的數字部分放在括号中 (/ [a-z] + (\d+)/) ,我們就可以從所檢索到的任何比對中抽取數字了,之後我們會對此進行解析的.

代括号的子表達式的另一個用途是,允許我們在同一正規表達式的後面引用前面的子表達式.這是通過在字元串 \ 後加一位或多位數字來實作的.數字指的是代括号的

子表達式在正規表達式中的位置.例如: \1 引用的是第一個代括号的子表達式. \3 引用的是第三個代括号的子表達式.注意,由于子表達式可以嵌套在其它子表達式中,

是以它的位置是被計數的左括号的位置.

例如:在下面的正規表達式被指定為 \2:

/([Jj]ava([Ss]cript)) \sis \s (fun\w*) /

對正規表達式中前一子表達式的引用所指定的并不是那個子表達式的模式,而是與那個模式相比對的文本.這樣,引用就不隻是幫助你輸入正規表達式的重複部分的快

捷方式了,它還實施了一條規約,那就是一個字元串各個分離的部分包含的是完全相同的字元.例如:下面的正規表達式比對的就是位于單引号或雙引号之内的所有字

符.但是,它要求開始和結束的引号比對(例如兩個都是雙引号或者都是單引号):

/[' "] [^ ' "]*[' "]/

如果要求開始和結束的引号比對,我們可以使用如下的引用:

/( [' "] ) [^ ' "] * \1/

\1比對的是第一個代括号的子表達式所比對的模式.在這個例子中,它實施了一種規約,那就是開始的引号必須和結束的引号相比對.注意,如果反斜杠後跟随的數字比

代括号的子表達式數多,那麼它就會被解析為一個十進制的轉義序列,而不是一個引用.你可以堅持使用完整的三個字元來表示轉義序列,這們就可以避免混淆了.例如,

使用 \044,而不是\44.下面是正規表達式的選擇、分組和引用字元:

字元 含義

____________________________________________________________________

| 選擇.比對的要麼是該符号左邊的子表達式,要麼它右邊的子表達式

(...) 分組.将幾個項目分為一個單元.這個單元可由 *、+、?和|等符号使用,而且還可以記住和這個組比對的字元以供此後引

用使用

\n 和第n個分組所比對的字元相比對.分組是括号中的子表達式(可能是嵌套的).分組号是從左到右計數的左括号數

____________________________________________________________________

5.指定比對的位置

我們已經看到了,一個正規表達式中的許多元素才能夠比對字元串的一個字元.例如: \s 比對的隻是一個空白符.還有一些正規表達式的元素比對的是字元之間寬度為

0的空間,而不是實際的字元例如: \b 比對的是一個詞語的邊界,也就是處于一個/w字字元和一個\w非字字元之間的邊界.像\b 這樣的字元并不指定任何一個比對了的

字元串中的字元,它們指定的是比對所發生的合法位置.有時我們稱這些元素為正規表達式的錨.因為它們将模式定位在檢索字元串中的一個特定位置.最常用的錨元

素是 ^, 它使模式依賴于字元串的開頭,而錨元素$則使模式定位在字元串的末尾.

例如:要比對詞 "javascript" ,我們可以使用正規表達式 /^ javascript $/. 如果我們想檢索 "java" 這個詞自身 (不像在 "javascript" 中那樣作為字首),那麼我們可以使

用模式 /\s java \s /, 它要求在詞語java之前和之後都有空格.但是這樣作有兩個問題.第一: 如果 "java" 出現在一個字元的開頭或者是結尾.該模式就不會與之比對,除

非在開頭和結尾處有一個空格. 第二: 當這個模式找到一個與之比對的字元時,它傳回的比對的字元串前端和後端都有空格,這并不是我們想要的.是以,我們使用詞語

的邊界 \b 來代替真正的空格符 \s 進行比對. 結果表達式是 /\b java \b/.

下面是正規表達式的錨字元:

字元 含義

____________________________________________________________________

^ 比對的是字元的開頭,在多行檢索中,比對的是一行的開頭

$ 比對的是字元的結尾,在多行檢索中,比對的是一行的結尾

\b 比對的是一個詞語的邊界.簡而言之就是位于字元\w 和 \w之間的位置(注意:[\b]比對的是倒退符)

\B 比對的是非詞語的邊界的字元

_____________________________________________________________________

6.屬性

有關正規表達式的文法還有最後一個元素,那就是正規表達式的屬性,它說明的是進階模式比對的規則.和其它正規表達式文法不同,屬性是在 / 符号之外說明的.即它

們不出現在兩個斜杠之間,而是位于第二個斜杠之後.javascript 1.2支援兩個屬性.屬性 i 說明模式比對應該是大小寫不敏感的.屬性 g 說明模式比對應該是全局的.也

就是說,應該找出被檢索的字元串中所有的比對.這兩種屬性聯合起來就可以執行一個全局的,大小寫不敏感的比對.

例如: 要執行一個大小不敏感的檢索以找到詞語 "java" (或者是 "java" 、"JAVA"等) 的第一個具體值,我們可以使用大小不敏感的正規表達式 /\b java\b/i .如果要在

一個字元串中找到 "java" 所有的具體值,我們還可以添加屬性 g, 即 /\b java \b/gi .

以下是正規表達式的屬性:

字元 含義

_________________________________________

i 執行大小寫不敏感的比對

g 執行一個全局的比對,簡而言之,就是找到所有的比對,而不是在找到第一個之後就停止了

_________________________________________

除屬性 g 和 i 之外,正規表達式就沒有其它像屬性一樣的特性了.如果将構造函數 RegExp 的靜态屬性 multiline 設定為 true ,那麼模式比對将以多行的模式進行.在這

種模式下,錨字元 ^ 和 $ 比對的不隻是檢索字元串的開頭和結尾,還比對檢索字元串内部的一行的開頭和結尾.例如: 模式 /Java$/ 比對的是 "Java",但是并不比對

"Java\nis fun" .如果我們設定了 multiline 屬性,那麼後者也将被比對:

RegExp.multiline = true;

在JAVASCRIPT裡面判斷一個字元串是否是電子郵件的格式:

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

{

alert("您的電子郵件格式錯誤!");

formname.email.focus();

return false;

}

閱讀全文(42) | 回複(0) | 引用(0) | [用365key收藏此日志]

[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種正規表達式
作者: 不祥  時間: 2004-6-9

"^\\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

JavaScript中的正規表達式(2)
作者 :中國論壇網收集 來源 :http://www.51one.net 加入時間 :2004-8-25  

正規表達式對象的屬性及方法

   預定義的正規表達式擁有有以下靜态屬性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。其中input和multiline可以預設定。其他屬性的值在執行過exec或test方法後被根據不同條件賦以不同的值。許多屬性同時擁有長和短(perl風格)的兩個名字,并且,這兩個名字指向同一個值。(JavaScript模拟perl的正規表達式)

正規表達式對象的屬性

屬性 含義
$1...$9 如果它(們)存在,是比對到的子串
$_ 參見input
$* 參見multiline
$& 參見lastMatch
$+ 參見lastParen
$` 參見leftContext
$''          參見rightContext
constructor    建立一個對象的一個特殊的函數原型
global       是否在整個串中比對(bool型)
ignoreCase     比對時是否忽略大小寫(bool型)
input        被比對的串
lastIndex     最後一次比對的索引
lastParen     最後一個括号括起來的子串
leftContext    最近一次比對以左的子串
multiline     是否進行多行比對(bool型)
prototype     允許附加屬性給對象
rightContext    最近一次比對以右的子串
source       正規表達式模式
lastIndex     最後一次比對的索引
正規表達式對象的方法
方法 含義
compile      正規表達式比較
exec        執行查找
test        進行比對
toSource      傳回特定對象的定義(literal representing),其值可用來建立一個新的對象。重載Object.toSource方法得到的。
toString      傳回特定對象的串。重載Object.toString方法得到的。
valueOf      傳回特定對象的原始值。重載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正規表達式檢驗

責任編輯:fuxing [ 網人帝國 ] 添加時間:2003-11-13 9:13:00 人氣:1169 【 大 中 小 】

//校驗是否全由數字組成

function isDigit(s)

{

var patrn=/^[0-9]{1,20}$/;

if (!patrn.exec(s)) return false

return true

}

//校驗登入名:隻能輸入5-20個以字母開頭、可帶數字、“_”、“.”的字串

function isRegisterUserName(s)

{

var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;

if (!patrn.exec(s)) return false

return true

}

//校驗使用者姓名:隻能輸入1-30個以字母開頭的字串

function isTrueName(s)

{

var patrn=/^[a-zA-Z]{1,30}$/;

if (!patrn.exec(s)) return false

return true

}

//校驗密碼:隻能輸入6-20個字母、數字、下劃線

function isPasswd(s)

{

var patrn=/^(\w){6,20}$/;

if (!patrn.exec(s)) return false

return true

}

//校驗普通電話、傳真号碼:可以“+”開頭,除數字外,可含有“-”

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

}

//校驗手機号碼:必須以數字開頭,除數字外,可含有“-”

function isMobil(s)

{

var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;

if (!patrn.exec(s)) return false

return true

}

//校驗郵政編碼

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

}

//校驗搜尋關鍵字

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

}

正規表達式regular expression詳述(一)

http://www.kymita.com/888.asp 2002-12-15 藍箭工作室

正規表達式是regular expression,看來英文比中文要好了解多了,就是檢查表達式符

不符合規定!!正規表達式有一個功能十分強大而又十分複雜的對象RegExp,在JavaScript1.2 版本以

上提供。

下面我們看看有關正規表達式的介紹:

正規表達式對象用來規範一個規範的表達式(也就是表達式符不符合特定的要求,比如是不是Email

位址格式等),它具有用來檢查給出的字元串是否符合規則的屬性和方法。

除此之外,你用RegExp構造器建立的個别正規表達式對象的屬性,就已經預先定義好了正規表達式

對象的靜态屬性,你可以随時使用它們。

核心對象:

在JavaScript 1.2, NES 3.0以上版本提供。

在JavaScript 1.3以後版本增加了toSource方法。

建立方法:

文字格式或RegExp構造器函數。

文字建立格式使用以下格式:

/pattern/flags即/模式/标記

構造器函數方法使用方法如下:

new RegExp("pattern"[, "flags"])即new RegExp("模式"[,"标記"])

參數:

pattern(模式)

表示正規表達式的文本

flags(标記)

如果指定此項,flags可以是下面值之一:

g: global match(全定比對)

i: ignore case(忽略大小寫)

gi: both global match and ignore case(比對所有可能的值,也忽略大小寫)

注意:文本格式中的參數不要使用引号标記,而構造器函數的參數則要使用引号标記。是以下面的

表達式建立同樣的正規表達式:

/ab+c/i

   new RegExp("ab+c", "i")

描述:

當使用構造函數的時候,必須使用正常的字元串避開規則(在字元串中加入前導字元\ )是必須的。

例如,下面的兩條語句是等價的:

re = new RegExp("\\w+")

re = /\w+/

下面的提供了在正規表達式中能夠使用的完整對特殊字元的一個完整的清單和描述。

表1.3:正規表達式中的特殊字元:

字元\

意義:對于字元,通常表示按字面意義,指出接着的字元為特殊字元,\不作解釋。

例如:/b/比對字元'b',通過在b 前面加一個反斜杠\,也就是/\b/,則該字元變成特殊字元,表示

比對一個單詞的分界線。

或者:

對于幾個字元,通常說明是特殊的,指出緊接着的字元不是特殊的,而應該按字面解釋。

例如:*是一個特殊字元,比對任意個字元(包括0個字元);例如:/a*/意味比對0個或多個a。

為了比對字面上的*,在a前面加一個反斜杠;例如:/a\*/比對'a*'。

字元^

意義:表示比對的字元必須在最前邊。

例如:/^A/不比對"an A,"中的'A',但比對"An A."中最前面的'A'。

字元$

意義:與^類似,比對最末的字元。

例如:/t$/不比對"eater"中的't',但比對"eat"中的't'。

字元*

意義:比對*前面的字元0次或n次。

例如:/bo*/比對"A ghost booooed"中的'boooo'或"A bird warbled"中的'b',但不比對"A goat g

runted"中的任何字元。

字元+

意義:比對+号前面的字元1次或n次。等價于{1,}。

例如:/a+/比對"candy"中的'a'和"caaaaaaandy."中的所有'a'。

字元?

意義:比對?前面的字元0次或1次。

例如:/e?le?/比對"angel"中的'el'和"angle."中的'le'。

字元.

意義:(小數點)比對除換行符外的所有單個的字元。

例如:/.n/比對"nay, an apple is on the tree"中的'an'和'on',但不比對'nay'。

字元(x)

意義:比對'x'并記錄比對的值。

例如:/(foo)/比對和記錄"foo bar."中的'foo'。比對子串能被結果數組中的素[1], ..., [n] 返

回,或被RegExp對象的屬性$1, ..., $9傳回。

字元x|y

意義:比對'x'或者'y'。

例如:/green|red/比對"green apple"中的'green'和"red apple."中的'red'。

字元{n}

意義:這裡的n是一個正整數。比對前面的n個字元。

例如:/a{2}/不比對"candy,"中的'a',但比對"caandy," 中的所有'a'和"caaandy."中前面的兩個

'a'。

字元{n,}

意義:這裡的n是一個正整數。比對至少n個前面的字元。

例如:/a{2,}不比對"candy"中的'a',但比對"caandy"中的所有'a'和"caaaaaaandy."中的所有'a'

字元{n,m}

意義:這裡的n和m都是正整數。比對至少n個最多m個前面的字元。

例如:/a{1,3}/不比對"cndy"中的任何字元,但比對 "candy,"中的'a',"caandy," 中的前面兩個

'a'和"caaaaaaandy"中前面的三個'a',注意:即使"caaaaaaandy" 中有很多個'a',但隻比對前面的三

個'a'即"aaa"。

字元[xyz]

意義:一字元清單,比對列出中的任一字元。你可以通過連字元-指出一個字元範圍。

例如:[abcd]跟[a-c]一樣。它們比對"brisket"中的'b'和"ache"中的'c'。

字元[^xyz]

意義:一字元補集,也就是說,它比對除了列出的字元外的所有東西。 你可以使用連字元-指出一

字元範圍。

例如:[^abc]和[^a-c]等價,它們最早比對"brisket"中的'r'和"chop."中的'h'。

字元[\b]

意義:比對一個空格(不要與\b混淆)

字元\b

意義:比對一個單詞的分界線,比如一個空格(不要與[\b]混淆)

例如:/\bn\w/比對"noonday"中的'no',/\wy\b/比對"possibly yesterday."中的'ly'。

字元\B

意義:比對一個單詞的非分界線

例如:/\w\Bn/比對"noonday"中的'on',/y\B\w/比對"possibly yesterday."中的'ye'。

字元\cX

意義:這裡的X是一個控制字元。比對一個字元串的控制字元。

例如:/\cM/比對一個字元串中的control-M。

字元\d

意義:比對一個數字,等價于[0-9]。

例如:/\d/或/[0-9]/比對"B2 is the suite number."中的'2'。

字元\D

意義:比對任何的非數字,等價于[^0-9]。

例如:/\D/或/[^0-9]/比對"B2 is the suite number."中的'B'。

字元\f

意義:比對一個表單符

字元\n

意義:比對一個換行符

字元\r

意義:比對一個回車符

字元\s

意義:比對一個單個white空格符,包括空格,tab,form feed,換行符,等價于[ \f\n\r\t\v]。

例如:/\s\w*/比對"foo bar."中的' bar'。

字元\S

意義:比對除white空格符以外的一個單個的字元,等價于[^ \f\n\r\t\v]。

例如:/\S/\w*比對"foo bar."中的'foo'。

字元\t

意義:比對一個制表符

字元\v

意義:比對一個頂頭制表符

字元\w

意義:比對所有的數字和字母以及下劃線,等價于[A-Za-z0-9_]。

例如:/\w/比對"apple,"中的'a',"$5.28,"中的'5'和"3D."中的'3'。

字元\W

意義:比對除數字、字母外及下劃線外的其它字元,等價于[^A-Za-z0-9_]。

例如:/\W/或者/[^$A-Za-z0-9_]/比對"50%."中的'%'。

字元\n

意義:這裡的n是一個正整數。比對一個正規表達式的最後一個子串的n的值(計數左圓括号)。

例如:/apple(,)\sorange\1/比對"apple, orange, cherry, peach."中的'apple, orange',下面

有一個更加完整的例子。

注意:如果左圓括号中的數字比\n指定的數字還小,則\n取下一行的八進制escape作為描述。

字元\ooctal和\xhex

意義:這裡的\ooctal是一個八進制的escape值,而\xhex是一個十六進制的escape值,允許在一個

正規表達式中嵌入ASCII碼。

當表達式被檢查的時候,文字元号提供了編輯正規表達式的方法。利用文字元号可以使到正則表達

式保持為常數。例如,如果你在一個循環中使用文字元号來構造一個正規表達式,正規表達式不需進行

反複編譯。

正規表達式對象構造器,例如,new RegExp("ab+c"),提供正規表達式的運作時編譯。當你知道正

則表達式的模式會變化的時候,應該使用構造函數,或者你不知道正規表達式的模式,而它們是從另外

的源獲得的時候,比如由使用者輸入時。一旦你定義好了正規表達式,該正規表達式可在任何地方使用,

并且可以改變,你可以使用編譯方法來編譯一個新的正規表達式以便重新使用。

一個分離預先定義的RegExp對象可以在每個視窗中使用;也就是說,每個分離的JavaScript線程運

行以獲得自己的RegExp對象。因為每個腳本在一個線程中是不可中斷的,這就確定了不同的腳本不會覆

蓋RegExp對象的值。

預定義的RegExp對象包含的靜态屬性:input, multiline, lastMatch,lastParen, leftContext,

rightContext, 以及從$1到$9。input和multiline屬性能被預設。其它靜态屬性的值是在執行個别正則

表達式對象的exec和test方法後,且在執行字元串的match和replace方法後設定的。

屬性

注意RegExp對象的幾個屬性既有長名字又有短名字(象Perl)。這些名字都是指向相同的值。Perl是

一種程式設計語言,而JavaScript模仿了它的正規表達式。

屬性$1, ..., $9

取得比對的子串,如果有的話

屬性$_

參考input

屬性$*

參考multiline

屬性$&

參考lastMatch

屬性$+

參考lastParen

屬性$`

參考leftContext

屬性$'

參考rightContext

屬性constructor

指定用來建立對象原型函

屬性global

決定是否測試正規表達式是否不能比對所有的字元串,或者隻是與最先的沖突。

屬性ignoreCase

決定試圖比對字元串的時候是否忽略大小寫

屬性input

當正規表達式被比對的時候,為相反的字元串。

屬性lastIndex

決定下一次比對從那裡開始

屬性lastMatch

最後一個比對的字元

屬性lastParen

子串比對的時候,最後一個parenthesized,如果有的話。

屬性leftContext

最近一次比對前的子串。

屬性multiline

是否在串的多行中搜尋。

屬性prototype

允許附加屬性到所有的對象

屬性rightContext

最近一次比對後的的子串。

屬性source

模式文本

方法

compile方法

編譯一個正規表達式對象

exec方法

運作正規表達式比對

test方法

測試正則達式比對

toSource方法

傳回一個對象的文字描述指定的對象;你可以使用這個值來建立一個新的對象。不考慮Object.toS

ource方法。

toString方法

傳回一個字元串描述指定的對象,不考慮Object.toString對象。

valueOf方法

傳回指定對角的原始值。不考慮Object.valueOf方法。

 另外,這個對象繼承了對象的watch和unwatch方法

   例子:

   例1、下述示例腳本使用replace方法來轉換串中的單詞。在替換的文本中,腳本使用全局 RegExp

對象的$1和$2屬性的值。注意,在作為第二個參數傳遞給replace方法的時候,RegExp對象的$屬性的名

稱。

<SCRIPT LANGUAGE="JavaScript1.2">

re = /(\w+)\s(\w+)/;

str = "John Smith";

newstr=str.replace(re,"$2, $1");

document.write(newstr)

</SCRIPT>

顯示結果:"Smith, John".

  例2、下述示例腳本中,RegExp.input由Change事件處理句柄設定。在getInfo函數中,exec 方法

使用RegExp.input的值作為它的參數,注意RegExp預置了$屬性。

<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>

  請輸入你的姓和年齡,輸入完後按Enter鍵。

   <FORM><INPUT TYPE="TEXT" NAME="NameAge" onChange="getInfo(this);"></FORM>

   </HTML>

$1, ..., $9屬性

用圓括号括着的比對子串,如果有的話。

是RegExp的屬性

靜态,隻讀

在JavaScript 1.2, NES 3.0以上版本提供

描述:因為input是靜态屬性,不是個别正規表達式對象的屬性。你可以使用RegExp.input 通路該

屬性。

能加上圓括号的子串的數量不受限制,但正規表達式對象隻能保留最後9 條。如果你要通路所有的

圓括号内的比對字串,你可以使用傳回的數組。

這些屬性能用在RegExp.replace方法替換後的字元串(輸出結果)。當使用這種方式的時候,不用預

先考慮RegExp對象。下面給出例子。當正規表達式中沒有包含圓括号的時候,該腳本解釋成$n的字面意

義。(這裡的n是一個正整數)。

例如:

下例腳本使用replace 方法來交換串中單詞的位置。在替換後的文本字串中,腳本使用正規表達式

RegExp對象的$1和$2屬性的值。注意:當它們向replace方法傳遞參數的時候,這裡沒有考慮 $ 屬性的

RegExp對象的名稱。

<SCRIPT LANGUAGE="JavaScript1.2">

re = /(\w+)\s(\w+)/;

str = "John Smith";

newstr=str.replace(re,"$2, $1");

document.write(newstr)

</SCRIPT>

顯示的輸出結果為:Smith, John。

正規表達式regular expression詳述(二)

http://www.kymita.com/888.asp 2002-12-15 藍箭工作室

正規表達式詳述(二)

以下這些不是正規表達式的新增對象請參閱對應的JavaScript對象的屬性 $_屬性 參考input $*屬性

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

參考leftContext $'屬性 參考rightContext compile方法 在腳本運作期間編譯正規表達式對象

屬于RegExp的方法 在JavaScript 1.2, NES 3.0以上版本提供 文法:

regexp.compile(pattern[, flags]) 以數: regexp 正規表達式的名稱,可以是變量名或文字串。

pattern 正規表達式的定義文本。 flags 如果指定的話,可以是下面其中的一個: "g": 比對所有可能的字串

"i": 忽略大小寫 "gi": 比對所有可能的字串及忽略大小寫 描述:

使用compile方法來編譯一個正規表達式 created with the RegExp constructor function。這樣

就強制正規表達式隻編譯一次,而不是每次遇到正規表達式的時候都編譯一次。當你确認正規表達式能

保持不變的時候可使用compile 方法來編譯它(在獲得它的比對模式後),這樣就可以在腳本中重複多次使用它。

你亦可以使用compile 方法來改變在運作期間改變正規表達式。例如,假如正規表達式發生變化,

你可以使用compile方法來重新編譯該對象來提高使用效率。

使用該方法将改變正規表達式的source, global和ignoreCasesource屬性的值。 constructor

指出建立對象原型的function。注意這個屬性的值由函數本身提供,而不是一個字串包含RegExp的name.Property提供。

在JavaScript 1.1, NES 2.0以上版本提供 ECMA版本ECMA-262 描述:參考Object.constructor.

exec方法 在指定的字元串運作比對搜尋。傳回一個結果數組。 是RegExp的方法

在JavaScript 1.2, NES 3.0以上版本提供 文法: regexp.exec([str])regexp([str])

參數: regexp,正規表達式的名稱,可以是一個變量名或文字定義串。

str,要比對正規表達式的字元串,如果省略,将使用RegExp.input的值。

描述:就如在文法描述中的一樣,正則表達工的exec方法能夠被直接調用(使用regexp.exec(str))或者間接調用(使用regexp(str))。

假如你隻是運作以找出是否比對,可以使用String搜尋方法。

假如比對成功,exec方法傳回一個數組并且更新正規表達式對象屬性的值和預先定義的正規表達式對象、RegExp。如果比對失敗,exec方法傳回null。

請看下例: <SCRIPT LANGUAGE="JavaScript1.2"> //比對一個b接着一個或多個d,再接着一個b

//忽略大小寫 myRe=/d(b+)(d)/ig; myArray = myRe.exec("cdbBdbsbz");

</SCRIPT> 下面是該腳本的傳回值:對象 屬性/Index 描述 例子

myArray

myArray的内容 ["dbBd", "bB", "d"]

index

基于0的比對index 1

input

原始字元串 cdbBdbsbz

[0]

最後比對的字元 dbBd

[1], ...[n]

用圓括号包覆的比對字元串,如果有的話。不限制括号的個數。 [1] = bB

[2] = d

myRe

lastIndex

開始下次比對操作的index值 5

ignoreCase

指出"i"是否使用以忽略大小寫 true

global

指出是否使用"g"标記來進行比對所有可能的字串 true

source

定義模式的文本字元串 d(b+)(d)

RegExp

lastMatch$&

最後比對的字元 dbBd

leftContext$\Q

最新比對前面的子串 c

rightContext$'

最新比對後面的子串 bsbz

$1, ...$9

圓括号内的比對子串,如果有的話。圓括号的個數不受限制,但RegExp隻能保留最後9個 $1 = bB

$2 = d

lastParen $+

最後一個加上圓括号的比對子串,如果有的話 d

假如你的正規表達式使用了"g"标記,你可以多次使用exec 方法來連續比對相同的串。當你這樣做

的時候,新的比對将從由正規表達式的lastIndex 屬性值确定的子串中開始。例如,假定你使用下面的腳本:

<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> 這個腳本顯示如下結果: Found abb. Next match starts at 3

Found ab. Next match starts at 9 例子:

在下面的例子中,使用者輸入一個名字,腳本根據輸入執行比對操作。接着檢查數組看是否和其它使用者的名字比對。

本腳本假定已注冊的使用者的姓已經存進了數組A中,或許從一個資料庫中取得。 <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 輸入你的姓然後按Enter鍵。

<FORM><INPUT TYPE:"TEXT" NAME="FirstName" onChange="lookup(this);"></FORM>

</HTML> global屬性 正規表達式中是否使用了"g"标記。 RegExp屬性,隻讀

在JavaScript 1.2, NES 3.0以上版本提供 描述: global是一個個别正規表達式對象的屬性

如果使用了"g"标記,global的值為true;否則為 false。"g"标記指定正規表達式測試所有可能的比對。

你不能直接改變該屬性的值,但可以調用compile方法來改變它。 ignoreCase 檢查正規表達式是否使用了"i"标記

RegExp屬性,隻讀 在JavaScript 1.2, NES 3.0以上版本提供 描述:

ignoreCase是個别正規表達式對象的一個屬性。

如果使用了"i"标記,則傳回true,否則傳回false。"i"标記訓示在進行比對的時候忽略大小寫。

你不能直接改變該屬性的值,但可以通過調用compile方法來改變它 input 指出正規表達式要測試那個字串。$_是這個屬性的另一個名字。

RegExp的屬性,靜态 在JavaScript 1.2, NES 3.0以上版本提供

描述:因為input是靜态的,不是某個個别的正規表達式對象的屬性。你也可以使用 RegExp.input來表示。

如果沒有給正規表達式的exec或test方法提供字元串,并且RegExp.input中有值,則使用它的值來調用該方法。

腳本或浏覽器能夠預置input屬性。如果被預置了值且調用exec或 test方法的時候沒有提供字元串

則調用exec或test的時候使用input的值。input可以被浏覽器以下面的方式設定:

當text表單域處理句柄被調用的時候,input被設定為該text輸入的字串。

當textarea表單域處理句柄被調用的時候,input被設定為textarea域内輸入的字串。注意multili

ne亦被設定成true進而能比對多行文本。 當select表單域處理句柄被調用的時候,input被設定成selected text的值。

當連結對象的處理句柄被調用的時候,input被設定成<A HREF=...>和</A>之間的字元串。

事件理現句柄處理完畢後,input屬性的值被清除。 lastIndex 可讀/可寫的一個整數屬性,指出下一次比對從哪裡開始。

RegExp的屬性 在JavaScript 1.2, NES 3.0以上版本提供

描述:lastIndex 是個别的正規表達式對象的屬性。 這個屬性隻有當正規表達式的"g"标記被使用以進行全串比對的時候才被設定。實行以下規則:

如果lastIndex大小字元串的長度,regexp.test和regexp.exec失敗,且lastIndex被設為0。

如果lastIndex等于字串的長度且正規表達式比對空字元串,則正規表達式從lastIndex的位置開始比對。

如果lastIndex等于字元串的長度且正規表達式不比對空字元串,則正規表達式不比對input,且lastIndex被置為0。

否則,lastIndex被設定成最近一次比對的下一點。 例如,按下面的順序執行腳本: re = /(hi)?/g 比對空字元串

re("hi") 傳回["hi", "hi"],lastIndex置為2

re("hi") 傳回[""],一個空數組,它的下标為0的元素就是比對字元串。在這種情況下,傳回空

串是因為lastIndex等于2(且仍然是2),并且"hi"的長度也是2。 lastMatch 最後一次比對字元串,$&是同樣的意思。

RegExp的屬性,靜态,隻讀 在JavaScript 1.2, NES 3.0以上版本提供

描述:因為lastMatch是靜态的,是以它不是個别指定正規表達式的屬性。你也可以使用RegExp.lastMatch。 lastParen

最後一次加上括号的比對字元串,如果有的話。$+是同樣的意思。 RegExp屬性,靜态,隻讀

在JavaScript 1.2, NES 3.0以上版本提供

描述:因為lastParen是靜态的,它不是某個個别正則式的屬性,你可以使用RegExp.lastParen 表達同樣的意思。

leftContext 最近一次比對前面的子串,$`具有相同的意思。 RegExp的屬性,靜态,隻讀

在JavaScript 1.2, NES 3.0以上版本提供

描述:因為leftContext是靜态的,不是某一個正規表達式的屬性,是以可以使用RegExp.leftContext來表達想同的意思。

multiline 反映是否比對多行文本,$*是相同的意思。 RegExp的屬性,靜态

在JavaScript 1.2, NES 3.0以上版本提供

描述:因為multiline是靜态的,而不是某個個别正規表達式的屬性,是以能夠用RegExp.multiline表達相同的意思。

如果允許比對多行文本,則multiline為true,如果搜尋必須在換行時停止,則為false。

腳本或浏覽器能夠設定multiline屬性。當一個textarea的事件處理句柄被調用的時候,multiline

被置為true。在事件處理句柄處理完畢後,multiline屬性值被清除。也就是說,如果你設定了multili

ne為true,則執行任何的事件處理句柄後,multiline被置為false。 prototype

描繪類的原型。你可以根據要求使用prototype來增加類的屬性或方法。為了獲得prototypes 的資

料,請參閱RegExp的Function.prototype.Property屬性。 從JavaScript 1.1, NES 2.0版本開始提供

ECMA版本ECMA-262 rightContext 最後一次比對的右邊的字元串,$'是同樣的效果。

RegExp的屬性,靜态,隻讀 從 JavaScript 1.2, NES 3.0以上版本開始提供

描述:因為rightContext是靜态的,不是某個個别正則表達工的屬性,可以使用RegExp.rightContext來達到相同的效果。

source 一個隻讀屬性,包含正規表達式定義的模式,不包僑forward slashes和"g"或"i"标記。 RegExp的屬性,隻讀

從JavaScript 1.2, NES 3.0以上版本開始提供

描述:source是個别正規表達式對象的屬性,你不能直接改變它的值,但可以通過調用compile 方法來改變它。 test

執行指定字元串的正規表達式比對搜尋,傳回true或false。 RegExp的方法

從JavaScript 1.2, NES 3.0以上版本開始提供 文法:regexp.test([str])

參數:regexp,正規表達式的名稱,可以是變量名或正規表達式定義文字串

str,要比對的字元串,如果省略,将使用RegExp.input的值為作參數

描述:當你需要知道一個字元串能否比對某個正則表達工,可以使用test方法(與String.search方

法類似); 為了獲得更多的資訊(但速度将變慢),可以使用exec方法(與String.match方法類似)。 例子:下面的例子顯示test是否成功的提示:

function testinput(re, str){

if (re.test(str)) midstring = " contains ";

else midstring = " does not contain ";

document.write (str + midstring + re.source); } toSource

傳回一個字元串象征對象的源碼 RegExp的方法 從JavaScript 1.3以上版本開始提供 文法:toSource()

參數:沒有 描述:toSource方法傳回下述的值: 對于内置的RegExp對象,toSource傳回下面的字元象征源碼不可用:

function Boolean(){ [native code] }

在RegExp場合中, toSource傳回象征源碼的字元串,通常這個方法是由JavaScript内部自動調用而不是不代碼中顯式調用。

更多請看Object.toSource toString 傳回描繪指定對象的字元串。 RegExp的方法

從JavaScript 1.1, NES 2.0開始提供 ECMA版本ECMA-262 文法:toString() 參數:無

描述:RegExp對象不考慮Object對象的toString方法;它不繼承Object.toString,對于RegExp 對

象,toString方法傳回一個代表該對象的字元串。 例如:下面的例子顯示象征RegExp對象的字元串

myExp = new RegExp("a+b+c"); alert(myExp.toString())

displays "/a+b+c/" 更多請看:Object.toString valueOf 傳回一個RegExp對象的原始值

RegExp的方法 從JavaScript 1.1版本開始提供 ECMA版本:ECMA-262 文法:valueOf()

參數:無 描述:RegExp的valueOf方法以字元串形式傳回RegExp對象的原始值,這個值與RegExp.toString相等。

該方法通常由JavaScript内部自動調用而不是顯式調用 例子: myExp = new RegExp("a+b+c");

alert(myExp.valueOf()) displays "/a+b+c/"

正規表達式在javascript中的幾個執行個體1(轉)

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

如果采用傳統的方式,就要可能就要采用下面的方式了

//清除左邊空格

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;

}

采用正規表達式,來去除兩邊的空格,隻需以下代碼

String.prototype.trim = function()

{

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

}

一句就搞定了,

可見正規表達式為我們節省了相當的編寫代碼量

! 移動手機号的校驗

如果采用傳統的校驗方式至少就要完成下面三步的校驗,

(1). 是否是數字

(2).是否是11位

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

如果采用正規表達式校驗,隻需以下代碼

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("請輸入正确的移動手機号碼!");

form.mobile.focus(); return false;

}

}

return true;

}

從上面的代碼可以看出校驗移動手機号隻需定義一個var reg=/13[5,6,7,8,9]\d{8}/;模式比對串就可以完成合法性校驗了

! URL的校驗,

條件:必須以http:// 或 https:// 開頭, 端口号必須為在1-65535 之間, 以下代碼完成了合法性校驗

//obj:資料對象

//dispStr :失敗提示内容顯示字元串

function checkUrlValid( obj, dispStr)

{

if(obj == null)

{

alert("傳入對象為空");

return false;

}

var str = obj.value;

var urlpatern0 = /^https?:\/\/.+$/i;

if(!urlpatern0.test(str))

{

alert(dispStr+"不合法:必須以'http:\/\/'或'https:\/\/'開頭!");

obj.focus();

return false;

}

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

if(!urlpatern2.test(str))

{

alert(dispStr+"端口号必須為數字且應在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+"不合法,請檢查!");

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+"端口号不能以0開頭!");

obj.focus();

return false;

}

t = parseInt(s);

if(t<1 || t >65535)

{

alert(dispStr+"端口号必須為數字且應在1-65535之間!");

obj.focus();

return false;

}

}

return true;

}

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

正規表達式在JavaScript應用
時間戳: 2004-11-30 15:29:30 人氣: 23
作者: AnyRock 來源:www.mending.cn

--------------------------------------------------------------

去掉字元串頭尾多餘的空格

/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, "");}

--------------------------------------------------------------

應用:計算字元串的長度(一個雙位元組字元長度計2,ASCII字元計1)

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

--------------------------------------------------------------

應用:javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實作,如下:

String.prototype.trim = function()

{

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

}

得用正規表達式從URL位址中提取檔案名的javascript程式,如下結果為page1

s="http://www.9499.net/page1.htm"

s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")

alert(s)

##利用正規表達式限制網頁表單裡的文本框輸入内容:

--------------------------------------------------------------

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

--------------------------------------------------------------

用正規表達式限制隻能輸入全角字元: οnkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,'))"

--------------------------------------------------------------

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

--------------------------------------------------------------

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

最近更新: AnyRock 2004-11-30 15:38:2 傳回頁首
用正規表達式和javascript對表單進行全面驗證

代碼:<!--

使用時請将下面的javascript代碼存到一個單一的js檔案中。

1、表單要求

<form name="formname" onSubmit="return validateForm(this)"></form>

将對表單中的所有以下類型的域依次驗證,所有驗證是去除了前導和字尾空格的,要注意是區分大小寫的。

2、空值驗證

表單中任意域加上emptyInfo屬性将對此域是否為空進行驗證(可以和最大長度驗證\一般驗證方式同時使用)。

無此屬性視為此域允許空值。

   如:<input type="text" name="fieldNamename" emptyInfo="字段不能為空!">

3、最大長度驗證(可以和空值驗證、一般驗證方式同時使用):

<input type="text" name="fieldNamename" maxlength="20" lengthInfo="最大長度不能超過20!">

或,<textarea maxlength="2000" lengthInfo="最大長度不能超過2000!">

3、一般驗證方式(不對空值做驗證):

   如:<input type="text" validator="^(19|20)[0-9]{2}$" errorInfo="不正确的年份!" >

4、标準驗證(不與其它驗證方式同時使用):

全部通過<input type="hidden">來實作,并且不需要name屬性以免送出到伺服器。

   4.1、合法日期驗證:

<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),

此處不對每個字段分别檢驗(如果要檢驗,請在年月日三個域分别使用前面的一般驗證方式),隻對日期的最大值是否合法檢查;

4.2、日期格式驗證(請注意,此驗證不對日期是否有效進行驗證,還未找到從格式中得到年月日資料的方法^_^):

<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="不正确的日期!">

其中格式僅對y、M、d、H、m、s進行支援(其它字元視為非時間的字元)

4.3、清單驗證:

檢驗清單(checkbox、redio、select)是否至少選中了一條記錄(對select主要用于多項選擇)

<input type="checkbox" name="checkbox1">

<input type="hidden" validatorType="Checkbox" fieldName="checkbox1" errorInfo="請至少選中一條記錄!">

其中validatorType可以是Checkbox、R、Select;

對于一個select表單,如果要求選擇一條不能是第一條的記錄,請用下列方式:

<select name="select1" emptyInfo="請選擇一個選項!">

<option value="">==請選擇==</option>

<option value="1">1</option>

<select>

4.4、Email驗證:

<input type="text" name="email">

<input type="hidden" fieldName="email" validatorType="Email" separator="," errorInfo="不正确的Email!">

其中separator為可選項,表示輸入多個email時的分隔符(無此選項隻能是一個位址)

4.5、加入其它javascript操作:

<script type="text/javascript">

function functionname(){

自定義方法

}

</script>

表單中加入<input type="hidden" validatorType="javascript" functionName="functionname">(此時emptyInfo等屬性無效)

時将調用function屬性中指定的javascript方法(要求方法傳回true或false,傳回false将不再驗證表單,也不送出表單)。

5、在表單通過驗證送出前disable一個按鈕(也可将其它域disable,不能與其它驗證同在一個域),不要求按鈕是表單中的最後一個

<input type="button" name="送出" validatorType="disable">

6、不驗證表單

   <input type="hidden" name="validate" value="0" functionName="functionname">

當validator域值為0時不對表單進行驗證,直接送出表單或執行指定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){//驗證格式是否合法

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){// 若驗證通過則傳回true

var disableList=new Array();

var field = theForm.elements; // 将表單中的所有元素放入數組

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;//空值驗證

if(emptyInfo!=null&&empty==true){

alert(emptyInfo);

field[i].focus();

return false;

}

var lengthInfo=field[i].lengthInfo;//最大長度驗證

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("驗證類型不被支援, fieldName: "+field[i].name);

return false;

}

if(rs==false){

return false;

}

}

else{//一般驗證

if(empty==false){

var v = field[i].validator; // 擷取其validator屬性

if(!v) continue; // 如果該屬性不存在,忽略目前元素

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>