javascript
javascript 之---正则表达式
正則表達(dá)式是一個(gè)描述字符模式的對象。
JavaScript的RegExp對象和String對象定義了使用正則表達(dá)式來執(zhí)行強(qiáng)大的模式匹配和文本檢索與替換函數(shù)的方法.在JavaScript中,正則表達(dá)式是由一個(gè)RegExp對象表示的.
'***********************
' \\JavaScript//
'
'***********************
一、RegExp對象兩種生成方式。
1、使用一個(gè)RegExp()構(gòu)造函數(shù)來創(chuàng)建RegExp對象:var pattern = new RegExp("s$");
2、用JavaScript 1.2中的新添加的一個(gè)特殊語法來創(chuàng)建RegExp對象.就像字符串直接量被定義為包含在引號內(nèi)的字符一樣, 正則表達(dá)式直接量也被定義為包含在一對斜杠(/)之間的字符.所以,JavaScript可能會包含如下的代碼:
var pattern = /s$/;
這行代碼創(chuàng)建一個(gè)新的RegExp對象,并將它賦給變量parttern.這個(gè)特殊的RegExp對象和所有以字母"s"結(jié)尾的字符串都匹配.用RegExp()也可以定義一個(gè)等價(jià)的正則表達(dá)式,代碼如下: var pattern = new RegExp("s$");
?
無論是用正則表達(dá)式直接量還是用構(gòu)造函數(shù)RegExp(),創(chuàng)建一個(gè)RegExp對象都是比較容易的.較為困難的任務(wù)是用正則表達(dá)式語法來描述字符的模式.
?
二、正則表達(dá)式的使用
JavaScript采用的是Perl語言正則表達(dá)式語法的一個(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)符號都有特殊的含義.下面是這些字符和它們的含義:
?
正則表達(dá)式的直接量字符
字符 匹配
________________________________
字母數(shù)字字符 自身
\ f 換頁符
\ 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)符號,必須在它們之前加上一個(gè) "\" .
2.字符類
將單獨(dú)的直接符放進(jìn)中括號內(nèi)就可以組合成字符類.一個(gè)字符類和它所包含的任何一個(gè)字符都匹配。
正則表達(dá)式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一個(gè)都匹配.另外還可以定義否定字符類,這些類匹配的是除那些包含在中括號之內(nèi)的字符外的所有字符.定義否定字符尖時(shí),要將一個(gè) ^ 符號作為從左中括號算起的第一個(gè)字符.正則表達(dá)式的集合是 / [a-zA-z0-9] / .
由于某些字符類非常常用,所以JavaScript的正則表達(dá)式語法包含一些特殊字符和轉(zhuǎn)義序列來表示這些常用的類.例如, \s 匹配的是空格符,制表符和其它空白符, ^\s 匹配的則是空白符之外的任何字符.
?
正則表灰式的字符類
字符 匹配
____________________________________________________
[...] 位于括號之內(nèi)的任意字符
[^...] 不在括號之中的任意字符
. 除了換行符之外的任意字符,等價(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ù)制
????? 用以上的正則表式的語法,可以把兩位數(shù)描述成 / \ d \ d /,把四位數(shù)描述成 / \d \ d \ d \ d /.但我們還沒有一種方法可以用來描述具有任意多數(shù)位的數(shù)字或者是一個(gè)字符串.這個(gè)串由三個(gè)字符以及跟隨在字母之后的一位數(shù)字構(gòu)成.這些復(fù)雜的模式使用的正則表達(dá)式語法指定了該表達(dá)式中每個(gè)元素要重復(fù)出現(xiàn)的次數(shù).
???? 指定復(fù)制的字符總是出現(xiàn)在它們所作用的模式后面.由于某種復(fù)制類型相當(dāng)常用.所以有一些特殊的字符專門用于表示它們.
???? 例如: +號匹配的就是復(fù)制前一模式一次或多次的模式.下面的表列出了復(fù)制語法.先看一個(gè)例子:
???? /\d{2, 4}/ //匹配2到4間的數(shù)字.
???? /\w{3} \d?/ //匹配三個(gè)單字字符和一個(gè)任意的數(shù)字.
???? /\s+java\s+/ //匹配字符串"java" ,并且該串前后可以有一個(gè)或多個(gè)空格.
???? /[^"] * / //匹配零個(gè)或多個(gè)非引號字符.
正則表達(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á)式的語法還包括指定選擇項(xiàng),對子表達(dá)式分組和引用前一子表達(dá)式的特殊字符.字符| 用于分隔供選擇的字符.
????? 例如: /ab|cd|ef/ 匹配的是字符串 "ab",或者是字符串 "cd",又或者 "ef".
???????????? ?/\d{3}|[a-z]{4}/ 匹配的是要么是一個(gè)三位數(shù),要么是四個(gè)小寫字母.
????? 在正則表達(dá)式中括號具有幾種作用.它的主要作用是把單獨(dú)的項(xiàng)目分組成子表達(dá)式,以便可以像處理一個(gè)獨(dú)立的單元那種用 *、+或? 來處理那些項(xiàng)目.
????? 例如: /java(script) ?/ 匹配的是字符串 "java",其后既可以有 "script",也可以沒有.
???????????? ./ (ab|cd) + |ef) / 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的一次或多次重復(fù).
????? 在正則表達(dá)式中,括號的第二個(gè)用途是在完整的模式中定義子模式。當(dāng)一個(gè)正則表達(dá)式成功地和目標(biāo)字符串相匹配時(shí),可以從目標(biāo)串中抽出和括號中的子模式相匹配的部分.例如,假定我們正在檢索的模式是一個(gè)或多個(gè)字母后面跟隨一位或多位數(shù)字,那么我們可以使用模式 / [a-z] + \ d+/.但是由于假定我們真正關(guān)心的是每個(gè)匹配尾部的數(shù)字,那么如果我們將模式的數(shù)字部分放在括號中 (/ [a-z] + (\d+)/) ,我們就可以從所檢索到的任何匹配中抽取數(shù)字了,之后我們會對此進(jìn)行解析的.
???? 代括號的子表達(dá)式的另一個(gè)用途是,允許我們在同一正則表達(dá)式的后面引用前面的子表達(dá)式.這是通過在字符串 \ 后加一位或多位數(shù)字來實(shí)現(xiàn)的.數(shù)字指的是代括號的子表達(dá)式在正則表達(dá)式中的位置.
????? 例如: \1 引用的是第一個(gè)代括號的子表達(dá)式. \3 引用的是第三個(gè)代括號的子表達(dá)式.注意,由于子表達(dá)式可以嵌套在其它子表達(dá)式中, 所以它的位置是被計(jì)數(shù)的左括號的位置.
例如:在下面的正則表達(dá)式被指定為 \2:
/([Jj]ava([Ss]cript)) \sis \s (fun\w*) /
??? 對正則表達(dá)式中前一子表達(dá)式的引用所指定的并不是那個(gè)子表達(dá)式的模式,而是與那個(gè)模式相匹配的文本.這樣,引用就不只是幫助你輸入正則表達(dá)式的重復(fù)部分的快捷方式了,它還實(shí)施了一條規(guī)約,那就是一個(gè)字符串各個(gè)分離的部分包含的是完全相同的字符.例如:下面的正則表達(dá)式匹配的就是位于單引號或雙引號之內(nèi)的所有字 符.但是,它要求開始和結(jié)束的引號匹配(例如兩個(gè)都是雙引號或者都是單引號):
/[' "] [^ ' "]*[' "]/
如果要求開始和結(jié)束的引號匹配,我們可以使用如下的引用:
/( [' "] ) [^ ' "] * \1/
\1匹配的是第一個(gè)代括號的子表達(dá)式所匹配的模式.在這個(gè)例子中,它實(shí)施了一種規(guī)約,那就是開始的引號必須和結(jié)束的引號相匹配.注意,如果反斜杠后跟隨的數(shù)字比代括號的子表達(dá)式數(shù)多,那么它就會被解析為一個(gè)十進(jìn)制的轉(zhuǎn)義序列,而不是一個(gè)引用.你可以堅(jiān)持使用完整的三個(gè)字符來表示轉(zhuǎn)義序列,這們就可以避免混淆了.例如,
使用 \044,而不是\44.下面是正則表達(dá)式的選擇、分組和引用字符:
字符 含義
____________________________________________________________________
| 選擇.匹配的要么是該符號左邊的子表達(dá)式,要么它右邊的子表達(dá)式
(...) 分組.將幾個(gè)項(xiàng)目分為一個(gè)單元.這個(gè)單元可由 *、+、?和|等符號使用,而且還可以記住和這個(gè)組匹配的字符以供此后引用使用 \n 和第n個(gè)分組所匹配的字符相匹配.分組是括號中的子表達(dá)式(可能是嵌套的).分組號是從左到右計(jì)數(shù)的左括號數(shù)
____________________________________________________________________
?
5.指定匹配的位置
我們已經(jīng)看到了,一個(gè)正則表達(dá)式中的許多元素才能夠匹配字符串的一個(gè)字符.例如: \s 匹配的只是一個(gè)空白符.還有一些正則表達(dá)式的元素匹配的是字符之間寬度為0的空間,而不是實(shí)際的字符例如: \b 匹配的是一個(gè)詞語的邊界,也就是處于一個(gè)/w字字符和一個(gè)\w非字字符之間的邊界.像\b 這樣的字符并不指定任何一個(gè)匹配了的字符串中的字符,它們指定的是匹配所發(fā)生的合法位置.有時(shí)我們稱這些元素為正則表達(dá)式的錨.因?yàn)樗鼈儗⒛J蕉ㄎ辉跈z索字符串中的一個(gè)特定位置.最常用的錨元
素是 ^, 它使模式依賴于字符串的開頭,而錨元素$則使模式定位在字符串的末尾.
例如:要匹配詞 "javascript" ,我們可以使用正則表達(dá)式 /^ javascript $/. 如果我們想檢索 "java" 這個(gè)詞自身 (不像在 "javascript" 中那樣作為前綴),那么我們可以使用模式 /\s java \s /, 它要求在詞語java之前和之后都有空格.但是這樣作有兩個(gè)問題.第一: 如果 "java" 出現(xiàn)在一個(gè)字符的開頭或者是結(jié)尾.該模式就不會與之匹配,除非在開頭和結(jié)尾處有一個(gè)空格. 第二: 當(dāng)這個(gè)模式找到一個(gè)與之匹配的字符時(shí),它返回的匹配的字符串前端和后端都有空格,這并不是我們想要的.因此,我們使用詞語 的邊界 \b 來代替真正的空格符 \s 進(jìn)行匹配. 結(jié)果表達(dá)式是 /\b java \b/.
下面是正則表達(dá)式的錨字符:
字符 含義
____________________________________________________________________
^ 匹配的是字符的開頭,在多行檢索中,匹配的是一行的開頭
$ 匹配的是字符的結(jié)尾,在多行檢索中,匹配的是一行的結(jié)尾
\b 匹配的是一個(gè)詞語的邊界.簡而言之就是位于字符\w 和 \w之間的位置(注意:[\b]匹配的是退格符)
\B 匹配的是非詞語的邊界的字符
_____________________________________________________________________
?
6.屬性
????? 有關(guān)正則表達(dá)式的語法還有最后一個(gè)元素,那就是正則表達(dá)式的屬性,它說明的是高級模式匹配的規(guī)則.和其它正則表達(dá)式語法不同,屬性是在 / 符號之外說明的.即它們不出現(xiàn)在兩個(gè)斜杠之間,而是位于第二個(gè)斜杠之后.javascript 1.2支持兩個(gè)屬性.屬性 i 說明模式匹配應(yīng)該是大小寫不敏感的.屬性 g 說明模式匹配應(yīng)該是全局的.也就是說,應(yīng)該找出被檢索的字符串中所有的匹配.這兩種屬性聯(lián)合起來就可以執(zhí)行一個(gè)全局的,大小寫不敏感的匹配.
???? 例如: 要執(zhí)行一個(gè)大小不敏感的檢索以找到詞語 "java" (或者是 "java" 、"JAVA"等) 的第一個(gè)具體值,我們可以使用大小不敏感的正則表達(dá)式 /\b java\b/i .如果要在
?????? 一個(gè)字符串中找到 "java" 所有的具體值,我們還可以添加屬性 g, 即 /\b java \b/gi .
以下是正則表達(dá)式的屬性:
字符 含義
_________________________________________
i 執(zhí)行大小寫不敏感的匹配
g 執(zhí)行一個(gè)全局的匹配,簡而言之,就是找到所有的匹配,而不是在找到第一個(gè)之后就停止了
_________________________________________
除屬性 g 和 i 之外,正則表達(dá)式就沒有其它像屬性一樣的特性了.如果將構(gòu)造函數(shù) RegExp 的靜態(tài)屬性 multiline 設(shè)置為 true ,那么模式匹配將以多行的模式進(jìn)行.在這種模式下,錨字符 ^ 和 $ 匹配的不只是檢索字符串的開頭和結(jié)尾,還匹配檢索字符串內(nèi)部的一行的開頭和結(jié)尾.例如: 模式 /Java$/ 匹配的是 "Java",但是并不匹配
"Java\nis fun" .如果我們設(shè)置了 multiline 屬性,那么后者也將被匹配:
RegExp.multiline = true;
?
?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE> New Document </TITLE><META NAME="Generator" CONTENT="EditPlus"><META NAME="Author" CONTENT=""><META NAME="Keywords" CONTENT=""><META NAME="Description" CONTENT=""><script>function test(){ // var ss="A" var ss=document.fm.input1.value;alert("ASCII是:"+ss.charCodeAt()) // var x='\u0041'; // alert("65代表的字符是:"+x) } function parase(){//正則表達(dá)和字符串相關(guān)的操作var strXml="<author>jack</author>";/**查找子串的位置,如果沒有值,則返回-1* 與indexOf不同的是,index只能使用字符串,而search可以使用正則表達(dá)式。*/var i=strXml.search(/jack/); // 返回值為8i=strXml.search(/\w*jack\w*/); alert(i); // 返回值為8strXml="aar bbR ccr" //alert(strXml.replace(/r$/,"dddd") ); //匹配最后一個(gè)字母是r字符// alert(strXml.replace(/r/,"dddd") ); //匹配第一個(gè)r// alert(strXml.replace(/r/g,"dddd") ); //匹配所有的r // alert(strXml.replace(/r/gi,"dddd") ); //匹配所有的,且不區(qū)分大小寫strXml="aa## , bbR ccr" alert(strXml.replace(/\#\#\s\,/gi,"dddd") ); // \s:1個(gè)或多個(gè)空格 \,:表示逗號 \#:表示#}</script></HEAD><BODY><form name="fm" method="post"><input type="text" name="input1"><input type="button" value="點(diǎn)擊" οnclick="parase()"><input type="button" value="測試" οnclick="test()"> </form></BODY> </HTML>?
?
總結(jié)
以上是生活随笔為你收集整理的javascript 之---正则表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DHTML之-----document.
- 下一篇: Oracle的rownum原理和使用