欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript 正則表達(dá)式解析

 更新時(shí)間:2009年02月21日 03:51:20   作者:  
正則表達(dá)式是一個(gè)描述字符模式的對(duì)象。
JavaScript的RegExp對(duì)象和String對(duì)象定義了使用正則表達(dá)式來執(zhí)行強(qiáng)大的模式匹配和文本檢索與替換函數(shù)的方法.
  在JavaScript中,正則表達(dá)式是由一個(gè)RegExp對(duì)象表示的.當(dāng)然,可以使用一個(gè)RegExp()構(gòu)造函數(shù)來創(chuàng)建RegExp對(duì)象,也可以用 JavaScript 1.2中的新添加的一個(gè)特殊語(yǔ)法來創(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$");
  無論是用正則表達(dá)式直接量還是用構(gòu)造函數(shù)RegExp(),創(chuàng)建一個(gè)RegExp對(duì)象都是比較容易的.較為困難的任務(wù)是用正則表達(dá)式語(yǔ)法來描述字符的模式.JavaScript采用的是Perl語(yǔ)言正則表達(dá)式語(yǔ)法的一個(gè)相當(dāng)完整的子集.
  正則表達(dá)式的模式規(guī)范是由一系列字符構(gòu)成的.大多數(shù)字符(包括所有字母數(shù)字字符)描述的都是按照字面意思進(jìn)行匹配的字符.這樣說來,正則表達(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á)式還通過以反斜杠(\)開頭的轉(zhuǎn)義序列支持某些非
  字母字符.例如,序列 "\n" 在字符串中匹配的是一個(gè)直接量換行符.在正則表達(dá)式中,許多標(biāo)點(diǎn)符號(hào)都有特殊的含義.下面是這些字符和它們的含義:
  正則表達(dá)式的直接量字符
字符 匹配
________________________________
字母數(shù)字字符 自身
\ f 換頁(yè)符
\ n 換行符
\ r 回車
\ 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.字符類
  將單獨(dú)的直接符放進(jìn)中括號(hào)內(nèi)就可以組合成字符類.一個(gè)字符類和它所包含的任何一個(gè)字符都匹配,所以正則表達(dá)式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一個(gè)都匹配.另外還可以定義否定字符類,這些類匹配的是除那些包含在中括號(hào)之內(nèi)的字符外的所有字符.定義否定字符尖時(shí),要將一個(gè) ^ 符號(hào)作為從左中括號(hào)算起的第一個(gè)字符.正則表達(dá)式的集合是 / [a-zA-z0-9] / .
  由于某些字符類非常常用,所以JavaScript的正則表達(dá)式語(yǔ)法包含一些特殊字符和轉(zhuǎn)義序列來表示這些常用的類.例如, \s 匹配的是空格符,制表符和其它空白符, \s匹配的則是空白符之外的任何字符.
  正則表灰式的字符類
字符 匹配
____________________________________________________
[...] 位于括號(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 /.但我們還沒有一種方法可以用來描述具有任意多數(shù)位的數(shù)字或者是一個(gè)
  字符串.這個(gè)串由三個(gè)字符以及跟隨在字母之后的一位數(shù)字構(gòu)成.這些復(fù)雜的模式使用的正則表達(dá)式語(yǔ)法指定了該表達(dá)式中每個(gè)元素要重復(fù)出現(xiàn)的次數(shù).
  指定復(fù)制的字符總是出現(xiàn)在它們所作用的模式后面.由于某種復(fù)制類型相當(dāng)常用.所以有一些特殊的字符專門用于表示它們.例如: +號(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次,但是不能超過m次
{n, } 匹配前一項(xiàng)n次,或者多次
{n} 匹配前一項(xiàng)恰好n次
? 匹配前一項(xiàng)0次或1次,也就是說前一項(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è)小寫字母.在正則表達(dá)式中括號(hào)具有幾種作用.它的主要作用是把單獨(dú)的項(xiàng)目分組成子表達(dá)式,以便可以像處理一個(gè)獨(dú)立的單元那種用 *、+或? 來處理那些項(xiàng)目.例如: /java(script) ?/ 匹配的是字符串 "java",其后既可以有 "script",也可以沒有. /(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á)式.這是通過在字符串 \ 后加一位或多位數(shù)字來實(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)的所有字符.但是,它要求開始和結(jié)束的引號(hào)匹配(例如兩個(gè)都是雙引號(hào)或者都是單引號(hào)):
/[' "] [^ ' "]*[' "]/

  如果要求開始和結(jié)束的引號(hào)匹配,我們可以使用如下的引用:
/( [' "] ) [^ ' "] * \1/
  \1匹配的是第一個(gè)代括號(hào)的子表達(dá)式所匹配的模式.在這個(gè)例子中,它實(shí)施了一種規(guī)約,那就是開始的引號(hào)必須和結(jié)束的引號(hào)相匹配.注意,如果反斜杠后跟隨的數(shù)字比代括號(hào)的子表達(dá)式數(shù)多,那么它就會(huì)被解析為一個(gè)十進(jìn)制的轉(zhuǎn)義序列,而不是一個(gè)引用.你可以堅(jiān)持使用完整的三個(gè)字符來表示轉(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í)我們稱這些元素為正則表達(dá)式的錨.因?yàn)樗鼈儗⒛J蕉ㄎ辉跈z索字符串中的一個(gè)特定位置.最常用的錨元素是 ^, 它使模式依賴于字符串的開頭,而錨元素$則使模式定位在字符串的末尾.
  例如:要匹配詞 "javascript" ,我們可以使用正則表達(dá)式 /^ javascript $/. 如果我們想檢索 "java" 這個(gè)詞自身 (不像在 "javascript" 中那樣作為前綴),那么我們可以使用模式 /\s java \s /, 它要求在詞語(yǔ)java之前和之后都有空格.但是這樣作有兩個(gè)問題.第一: 如果 "java" 出現(xiàn)在一個(gè)字符的開頭或者是結(jié)尾.該模式就不會(huì)與之匹配,除非在開頭和結(jié)尾處有一個(gè)空格. 第二: 當(dāng)這個(gè)模式找到一個(gè)與之匹配的字符時(shí),它返回的匹配的字符串前端和后端都有空格,這并不是我們想要的.因此,我們使用詞語(yǔ)的邊界 \b 來代替真正的空格符 \s 進(jìn)行匹配. 結(jié)果表達(dá)式是 /\b java \b/.
下面是正則表達(dá)式的錨字符:

字符 含義
____________________________________________________________________
^ 匹配的是字符的開頭,在多行檢索中,匹配的是一行的開頭
$ 匹配的是字符的結(jié)尾,在多行檢索中,匹配的是一行的結(jié)尾
\b 匹配的是一個(gè)詞語(yǔ)的邊界.簡(jiǎn)而言之就是位于字符\w 和 \w之間的位置(注意:[\b]匹配的是退格符)
\B 匹配的是非詞語(yǔ)的邊界的字符
_____________________________________________________________________
  6.屬性
  有關(guān)正則表達(dá)式的語(yǔ)法還有最后一個(gè)元素,那就是正則表達(dá)式的屬性,它說明的是高級(jí)模式匹配的規(guī)則.和其它正則表達(dá)式語(yǔ)法不同,屬性是在 / 符號(hào)之外說明的.即它們不出現(xiàn)在兩個(gè)斜杠之間,而是位于第二個(gè)斜杠之后.javascript 1.2支持兩個(gè)屬性.屬性 i 說明模式匹配應(yīng)該是大小寫不敏感的.屬性 g 說明模式匹配應(yīng)該是全局的.也就是說,應(yīng)該找出被檢索的字符串中所有的匹配.這兩種屬性聯(lián)合起來就可以執(zhí)行一個(gè)全局的,大小寫不敏感的匹配.
  例如: 要執(zhí)行一個(gè)大小不敏感的檢索以找到詞語(yǔ) "java" (或者是 "java" 、"JAVA"等) 的第一個(gè)具體值,我們可以使用大小不敏感的正則表達(dá)式 /\b java\b/i .如果要在一個(gè)字符串中找到 "java" 所有的具體值,我們還可以添加屬性 g, 即 /\b java \b/gi .
以下是正則表達(dá)式的屬性:

字符 含義
_________________________________________
i 執(zhí)行大小寫不敏感的匹配
g 執(zhí)行一個(gè)全局的匹配,簡(jiǎn)而言之,就是找到所有的匹配,而不是在找到第一個(gè)之后就停止了
_________________________________________
  除屬性 g 和 i 之外,正則表達(dá)式就沒有其它像屬性一樣的特性了.如果將構(gòu)造函數(shù) RegExp 的靜態(tài)屬性 multiline 設(shè)置為 true ,那么模式匹配將以多行的模式進(jìn)行.在這種模式下,錨字符 ^ 和 $ 匹配的不只是檢索字符串的開頭和結(jié)尾,還匹配檢索字符串內(nèi)部的一行的開頭和結(jié)尾.例如: 模式 /Java$/ 匹配的是 "Java",但是并不匹配"Java\nis fun" .如果我們?cè)O(shè)置了 multiline 屬性,那么后者也將被匹配:
RegExp.multiline = true;
  正則表達(dá)式(regular expression)對(duì)象包含一個(gè)正則表達(dá)式模式(pattern)。它具有用正則表達(dá)式模式去匹配或代替一個(gè)串(string)中特定字符(或字符集合)的屬性(properties)和方法(methods)。要為一個(gè)單獨(dú)的正則表達(dá)式添加屬性,可以使用正則表達(dá)式構(gòu)造函數(shù)(constructor function),無論何時(shí)被調(diào)用的預(yù)設(shè)置的正則表達(dá)式擁有靜態(tài)的屬性(the predefined RegExp object has static properties that are set whenever any regular expression is used, 我不知道我翻得對(duì)不對(duì),將原文列出,請(qǐng)自行翻譯)。
創(chuàng)建:
一個(gè)文本格式或正則表達(dá)式構(gòu)造函數(shù)
文本格式: /pattern/flags
正則表達(dá)式構(gòu)造函數(shù): new RegExp("pattern"[,"flags"]);
參數(shù)說明:
pattern -- 一個(gè)正則表達(dá)式文本
flags -- 如果存在,將是以下值:
g: 全局匹配
i: 忽略大小寫
gi: 以上組合
[注意] 文本格式的參數(shù)不用引號(hào),而在用構(gòu)造函數(shù)時(shí)的參數(shù)需要引號(hào)。如:/ab+c/i new RegExp("ab+c","i")是實(shí)現(xiàn)一樣的功能。在構(gòu)造函數(shù)中,一些特殊字符需要進(jìn)行轉(zhuǎn)意(在特殊字符前加"\")。如:re = new RegExp("\\w+")
  正則表達(dá)式中的特殊字符
字符 含意
\ 做為轉(zhuǎn)意,即通常在"\"后面的字符不按原來意義解釋,如/b/匹配字符"b",當(dāng)b前面加了反斜桿后/\b/,轉(zhuǎn)意為匹配一個(gè)單詞的邊界。
-或-
對(duì)正則表達(dá)式功能字符的還原,如"*"匹配它前面元字符0次或多次,/a*/將匹配a,aa,aaa,加了"\"后,/a\*/將只匹配"a*"。
^ 匹配一個(gè)輸入或一行的開頭,/^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è)回車符
\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]。


  說了這么多了,我們來看一些正則表達(dá)式的實(shí)際應(yīng)用的例子:
E-mail地址驗(yàn)證:
function test_email(strEmail) {
var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
if(myReg.test(strEmail)) return true;
return false;
}
HTML代碼的屏蔽
function mask_HTMLCode(strInput) {
var myReg = /<(\w+)>/;
return strInput.replace(myReg, "<$1>");
}
正則表達(dá)式對(duì)象的屬性及方法
  預(yù)定義的正則表達(dá)式擁有有以下靜態(tài)屬性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。其中input和multiline可以預(yù)設(shè)置。其他屬性的值在執(zhí)行過exec或test方法后被根據(jù)不同條件賦以不同的值。許多屬性同時(shí)擁有長(zhǎng)和短(perl風(fēng)格)的兩個(gè)名字,并且,這兩個(gè)名字指向同一個(gè)值。(JavaScript模擬perl的正則表達(dá)式)
正則表達(dá)式對(duì)象的屬性 屬性 含義
$1...$9 如果它(們)存在,是匹配到的子串
$_ 參見input
$* 參見multiline
$& 參見lastMatch
$+ 參見lastParen
$` 參見leftContext
$'          參見rightContext
constructor    創(chuàng)建一個(gè)對(duì)象的一個(gè)特殊的函數(shù)原型
global       是否在整個(gè)串中匹配(bool型)
ignoreCase     匹配時(shí)是否忽略大小寫(bool型)
input        被匹配的串
lastIndex     最后一次匹配的索引
lastParen     最后一個(gè)括號(hào)括起來的子串
leftContext    最近一次匹配以左的子串
multiline     是否進(jìn)行多行匹配(bool型)
prototype     允許附加屬性給對(duì)象
rightContext    最近一次匹配以右的子串
source       正則表達(dá)式模式
lastIndex     最后一次匹配的索引

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

相關(guān)文章

最新評(píng)論