1. 程式人生 > >DOM筆記(十):JavaScript正則表達式

DOM筆記(十):JavaScript正則表達式

asc mark space $1 rep 可能 多次 -h 區分

技術分享

一、RegExp

ECMAScript通過RegExp類型類支持正則表達式,語法和Perl類似:

var exp = /pattern/flags;

patternb部分是不論什麽簡單的或復雜的正則表達式;flags是每一個正則表達式所帶的一個或者多個標誌。

正則表達式的模式匹配支持三個標誌:

g:全局模式,即模式應用於整個字符串。而非在發現第一個匹配項時馬上停止

i:不區分大寫和小寫模式

m:多行模式,即到達一行文本末尾是還會繼續茶查找下一行中是否存在與模式匹配的項。

1、創建正則表達式

JavaScript創建正則表示有兩種方式:字面量創建和RegExp對象創建。

//字面量創建
var pattern1 = /[bc]at/i;
var pattern2 = /\[bc\]at/ig;

//RegExp對象創建
var pattern3 = new RegExp("[bc]at","i");  //與pattern1等效
var pattern4 = new RegExp("\\[bc\\]at","ig");  //與pattern2等效

二者的差別有兩個方面:對特殊字符的轉換方式和實例創建。

RegExp構造函數的模式參數是字符串。所以須要對特殊字符進行雙重轉義。差別例如以下:

/\w\\hello/

字面量模式 等價的字符串
/\[bc\]at/ “\\[bc\\]at”
/\d.\d{1,2}/ “\\d.\\d{1,2}”
/\w\\hello/ “\\w\\\\hello”

在ECMAScript 3中。字面量形式共享一個RegExp實例。而構造函數的每一個實例都不同

var re = null,
      i;
for(i=0;i<3;i++)
{
     re = /cat/g;
     re.test("catastrophe");
}
for(i=0;i<3;i++)
{
     re = new
RegExp("cat","g"); re.test("catastrophe"); }

在低版本號瀏覽器中,如IE6,對於第一個循環僅僅彈出一次true,其余是false。第二個循環都彈出true。

在ECMAScript 5中規定:使用正則表達式字面量跟使用RegExp構造函數一樣。每次調用都創建新的實例。所以兩個循環在現代瀏覽器中都彈出true。

2、RegExp實例屬性

屬性 說明
global 布爾值,是否設置了g標誌
ignoreCase 布爾值,是否設置了i標誌
multiline 布爾值,是否設置了m標誌
lastIndex 整數,下一次匹配開始的字符位置
source 正則表達式的字符串表示

3、方法

經常使用的方法有兩個:exec()和test(),均接受一個字符串參數

若存在匹配項,exec()返回一個數組,數組有兩個額外的屬性:index和input。

index表示匹配項在字符串中的位置,input表示源字符串。即exec()的參數

在數組中,第一項是與整個模式匹配的字符串,其它項則與捕獲組匹配(若沒有捕獲組,則僅僅包括一項)。

不存在匹配項。exec()返回null。

test()表示字符串中是否存在匹配項,存在返回true,不存在返回false。

var text = "mom and dad and bady";
var pattern = /mom( and dad( and bady)?

)?/gi; var matches = pattern.exec(text); alert(matches.length); //3 alert(matches.index); //0 alert(matches.input); //mom and dad and bady alert(matches[0]); //mom and dad and bady alert(matches[1]); //and dad and bady alert(matches[2]); //and bady

對於exec()而言,若不設置全局標誌g。在同一個字符串上多次調用exec()始終返回第一個匹配項的信息;若設置了全局標誌g,每次調用exec()則從上次匹配的位置處繼續查找字符串。

二、String類型

String類型是字符串的對象包裝類型,與Number、Boolean等一樣(DOM筆記(九):引用類型、基本包裝類型和單體內置對象 ),也能夠用new來創建字符串。模式匹配在字符串處理中是非常實用的,String類型也定義了多個與其相關的方法。

match(pattern):pattern是一個字面量正則表達式或RegExp對象。本質上和exec()方法一樣。

var text = "cat,bat,sat,fat";
var pattern = /.at/;
var matches = text.match(pattern);
//var matches = pattern.exec(text);
alert(matches.index);
alert(matches[0]);
alert(pattern.lastIndex);

search(pattern):參數和match()同樣,從開頭開始查找。返回第一個匹配項的索引,若沒有匹配項,返回-1

var text = "cat,bat,sat,fat";
var pos = text.search(/at/);
alert(pos);   //1

replace(oldstring,newstring):用newstring替換oldstring。第一個字符串能夠是一個模式對象,第二個字符串能夠結合捕獲組使用,或者是一個函數。

var text = "cat,bat,sat,fat";
var pattern = /(.at)/g;
var re = text.replace(pattern,"word($1)");
alert(re);  //word(cat),word(bat),word(sat),word(fat)

假設模式中沒有捕獲組,則用空字符串取代。

若第二個參數是函數,則該函數接收三個參數:模式匹配項、模式匹配項在字符串中的位置和原始字符串。

function htmlEscape(text)
{
    return text.replace(/[<>"&]/g,function(match,pos,text)
        {
            switch(match)
            {
                case "<":
                    return "&lt;";
                case ">":
                    return "&gt;";
                case "&":
                    return "&amp;";
                case "\"":
                    return "&quot;";
            }
        });
}
//返回:&lt;p class=&quot;greeting&quot;&gt;helloWorld&lt;/p&gt;
alert(htmlEscape("<p class=\"greeting\">helloWorld</p>"));

若正則表達式中定義了多個捕獲組,則傳遞給函數的依次是匹配項、第一個捕獲組、第二個捕獲組。。

。。最後兩個參數不變。

split(string[,limit]):分隔字符串,返回一個數組。

string能夠是一個普通的字符串,也能夠是一個模式匹配對象。可選的limit表示返回數組的大小

var colorText = "red,blue,yellow,black";  
alert(colorText.split(","));   //[red,blue,yellow,black]
alert(colorText.split(",",2));  //[red,blue]
alert(colorText.split(/\W/));  //[red,blue,yellow,black]

三、正則表達式的規則

字符

說明

\

將下一個字符標記為一個特殊字符、或一個原義字符、或一個向後引用、或一個八進制轉義符。比如,“n”匹配字符“n”。

“\n”匹配一個換行符。序列“\\”匹配“\”而“\(”則匹配“(”。

^

匹配輸入字符串的開始位置。

假設設置了RegExp對象的Multiline屬性。^也匹配“\n”或“\r”之後的位置。

$

匹配輸入字符串的結束位置。

假設設置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。

*

匹配前面的子表達式零次或多次。比如,zo*能匹配“z”以及“zoo”。

*等價於{0,}。

+

匹配前面的子表達式一次或多次。

比如,“zo+”能匹配“zo”以及“zoo”。但不能匹配“z”。

+等價於{1,}。

?

匹配前面的子表達式零次或一次。比如,“do(es)?”能夠匹配“do”或“does”中的“do”。?等價於{0,1}。

{n}

n是一個非負整數。

匹配確定的n次。比如,“o{2}”不能匹配“Bob”中的“o”。可是能匹配“food”中的兩個o。

{n,}

n是一個非負整數。至少匹配n次。比如,“o{2,}”不能匹配“Bob”中的“o”。但能匹配“foooood”中的全部o。

“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。

{n,m}

m和n均為非負整數,當中n<=m。

最少匹配n次且最多匹配m次。比如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價於“o?”。請註意在逗號和兩個數之間不能有空格。

?

當該字符緊跟在不論什麽一個其它限制符(*,+,?,{n},{n,}。{n,m})後面時。匹配模式是非貪婪的。

非貪婪模式盡可能少的匹配所搜索的字符串。而默認的貪婪模式則盡可能多的匹配所搜索的字符串。

比如,對於字符串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配全部“o”。

.

匹配除“\n”之外的不論什麽單個字符。

要匹配包含“\n”在內的不論什麽字符。請使用像“[.\n]”的模式。

(pattern)

匹配pattern並獲取這一匹配。所獲取的匹配能夠從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用“\(”或“\)”。

(?:pattern)

匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以後使用。這在使用或字符“(|)”來組合一個模式的各個部分是非常實用。比如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。

(?=pattern)

正向預查。在不論什麽匹配pattern的字符串開始處匹配查找字符串。

這是一個非獲取匹配,也就是說,該匹配不須要獲取供以後使用。比如。“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配 “Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生後。在最後一次匹配之後馬上開始下一次匹配的搜索,而不是從包括預查的字符之後開始。

(?!pattern)

負向預查,在不論什麽不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不須要獲取供以後使用。比如 “Windows(?

!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

預查不消耗字符。也就是說,在一個匹配發生後,在最後一次匹配之後馬上開始下一次匹配的搜索,而不是從包括預查的字符之後開始

x|y

匹配x或y。比如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。

[xyz]

字符集合。

匹配所包括的隨意一個字符。

比如。“[abc]”能夠匹配“plain”中的“a”。

[^xyz]

負值字符集合。匹配未包括的隨意字符。比如。“[^abc]”能夠匹配“plain”中的“p”。

[a-z]

字符範圍。

匹配指定範圍內的隨意字符。比如,“[a-z]”能夠匹配“a”到“z”範圍內的隨意小寫字母字符。

[^a-z]

負值字符範圍。

匹配不論什麽不在指定範圍內的隨意字符。比如。“[^a-z]”能夠匹配不論什麽不在“a”到“z”範圍內的隨意字符。

\b

匹配一個單詞邊界。也就是指單詞和空格間的位置。

比如,“er\b”能夠匹配“never”中的“er”,但不能匹配“verb”中的“er”。

\B

匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

\d

匹配一個數字字符。等價於[0-9]。

\D

匹配一個非數字字符。

等價於[^0-9]。

\s

匹配不論什麽空白字符。包含空格、制表符、換頁符等等。等價於[\f\n\r\t\v]。

\S

匹配不論什麽非空白字符。等價於[^\f\n\r\t\v]。

\w

匹配包含下劃線的不論什麽單詞字符。等價於“[A-Za-z0-9_]”

\W

匹配不論什麽非單詞字符。等價於“[^A-Za-z0-9_]”。

\f、\n、\r、\t、\v

匹配一個換頁符、換行符、回車符、水平制表符、垂直制表符,分別等價於\x0c和\cL、\x0a和\cJ、\x0d和\cM、\x09和\cI、\x0b和\cK

\cx

匹配由x指明的控制字符。比如,\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之中的一個。否則。將c視為一個原義的“c”字符。

\xn

匹配n,當中n為十六進制轉義值。十六進制轉義值必須為確定的兩個數字長。

比如,“\x41”匹配“A”。

“\x041”則等價於“\x04&1”。

正則表達式中能夠使用ASCII編碼。

\num

匹配num,當中num是一個正整數。對所獲取的匹配的引用。比如,“(.)\1”匹配兩個連續的同樣字符。

\n

標識一個八進制轉義值或一個向後引用。假設\n之前至少n個獲取的子表達式。則n為向後引用。

否則。假設n為八進制數字(0-7)。則n為一個八進制轉義值。

\nm

標識一個八進制轉義值或一個向後引用。假設\nm之前至少有nm個獲得子表達式。則nm為向後引用。假設\nm之前至少有n個獲取,則n為一個後跟文字m的向後引用。假設前面的條件都不滿足,若n和m均為八進制數字(0-7),則\nm將匹配八進制轉義值nm。

\nml

假設n為八進制數字(0-3),且m和l均為八進制數字(0-7)。則匹配八進制轉義值nml。

\un

匹配n。當中n是一個用四個十六進制數字表示的Unicode字符。比如。\u00A9匹配版權符號(?)。

四、常見正則表達式:經常使用的正則表達式歸納

原文首發:http://www.ido321.com/1355.html

DOM筆記(十):JavaScript正則表達式