天天看點

js正規表達式

regexp 是正規表達式的縮寫;當您檢索某個文本時,可以使用一種模式來描述要檢索的内容;正規表達式就是這種模式。簡單的模式可以是一個單獨的字元,更複雜的模式包括了更多的字元,并可用于解析、格式檢查、替換等等;您可以規定字元串中的檢索位置,以及要檢索的字元類型,等等。

1.正規表達式可以測試字元串的某個模式;例如:可以對一個輸入字元串進行測試,看在該字元串是否存在一個電話号碼模式或一個信用卡号碼模式。這稱為資料有效性驗證

2.正規表達式可以實作文本替換;可以在文檔中使用一個正規表達式來辨別特定文字,然後可以全部将其删除,或者替換為别的文字

3.正規表達式可以根據模式比對從字元串中提取一個子字元串;可以用來在文本或輸入字段中查找特定文字

一個正規表達式就是由普通字元(例如字元 a 到 z)和特殊字元(稱為元字元)組成的文字模式;該模式描述在查找文字主體時待比對的一個或多個字元串;正規表達式作為一個模闆,将某個字元模式與所搜尋的字元串進行比對

使用構造函數定義正規表達式,注意大小寫,否則就會不起作用;由于構造函數的參數是一個字元串,也可以是兩個斜杠的方式定義,遇到一些特殊字元就需要使用進行轉義;通過雙斜杠的方式定義同樣的正規表達式:

1.通過字面量建立:var 變量名=/表達式/模式修飾符

eg:var re = /a/gi;

2.通過構造函數建立:new regexp("表達式","模式修飾符")

eg:var re = new regexp("a","gi");//比對所有的a或a

通過構造函數建立需要更多的轉義字元\

regexp構造函數第一個參數為正規表達式的文本内容,而第一個參數則為可選項标志.标志可以組合使用

兩個特殊的符号'^'和'$';他們的作用是分别指出一個字元串的開始和結束。

例子如下:

"^the":表示所有以"the"開始的字元串("there","the cat"等);

"of despair$":表示是以以"of despair"結尾的字元串;

"^abc$":表示開始和結尾都是"abc"的字元串——呵呵,隻有"abc"自己了;

"notice":表示任何包含"notice"的字元串。

象最後這個例子,如果你不使用兩個特殊字元,你就在表示要查找的串在被查找串的任意部分——你并不把它定位在某一個頂端。

其它還有'*','+'和'?'這三個符号,表示一個或一序列字元重複出現的次數;它們分别表示“沒有或更多”,“一次或更多”還有“沒有或一次”。

下面是幾個例子:

"ab*":表示一個字元串有一個a後面跟着零個或若幹個b("a", "ab", "abbb",……);

"ab+":表示一個字元串有一個a後面跟着至少一個b或者更多;

"ab?":表示一個字元串有一個a後面跟着零個或者一個b;

"a?b+$":表示在字元串的末尾有零個或一個a跟着一個或幾個b。

你也可以使用範圍,用大括号括起,用以表示重複次數的範圍。

"ab{2}":表示一個字元串有一個a跟着2個b("abb");

"ab{2,}":表示一個字元串有一個a跟着至少2個b;

"ab{3,5}":表示一個字元串有一個a跟着3到5個b。

請注意,你必須指定範圍的下限(如:"{0,2}"而不是"{,2}")。

還有,你可能注意到了,'*','+'和'?'相當于"{0,}","{1,}"和"{0,1}"。

還有一個'|',表示“或”操作:

"hi|hello":表示一個字元串裡有"hi"或者"hello";

"(b|cd)ef":表示"bef"或"cdef";

"(a|b)*c":表示一串"a""b"混合的字元串後面跟一個"c";

'.'可以替代任何字元:

"a.[0-9]":表示一個字元串有一個"a"後面跟着一個任意字元和一個數字;

"^.{3}$":表示有任意三個字元的字元串(長度為3個字元);

方括号表示某些字元允許在一個字元串中的某一特定位置出現:

"[ab]":表示一個字元串有一個"a"或"b"(相當于"a|b");

"[a-d]":表示一個字元串包含小寫的'a'到'd'中的一個(相當于"a|b|c|d"或者"[abcd]");

"^[a-za-z]":表示一個以字母開頭的字元串;

"[0-9]%":表示一個百分号前有一位的數字;

",[a-za-z0-9]$":表示一個字元串以一個逗号後面跟着一個字母或數字結束。

你也可以在方括号裡用'^'表示不希望出現的字元,'^'應在方括号裡的第一位。

為了逐字表達,你必須在"^.$()|*+?{"這些字元前加上轉移字元''。

請注意在方括号中,不需要轉義字元。

正規表達式有3個方法:test()、exec() 以及 compile()

test():檢測給定的字元串是否滿足正規表達式,傳回一個 boolean 值,如果隻是單純的判斷被查找的字元串中是否存在,不需要其他的處理,可以使用compile,把正規表達式編譯為内部格式,進而執行得更快。

eg:

exec():檢索字元串中的指定值,傳回值是被找到的值;如果沒有發現比對,則傳回 null。

eg1:

您可以向 regexp 對象添加第二個參數,以設定檢索。例如,如果需要找到所有某個字元的所有存在,則可以使用 "g" 參數 ("global")

在使用 "g" 參數時,exec() 的工作原理如下:

找到第一個 "e",并存儲其位置;如果再次運作 exec(),則從存儲的位置開始檢索,并找到下一個 "e",并存儲其位置

eg2:

compile():方法用于改變 regexp;compile() 既可以改變檢索模式,也可以添加或删除第二個參數。

eg:

source:傳回正規表達式模式的文本複本,隻讀。

lastindex:傳回字元位置,它是被查找字元串中下一次成功比對的開始位置。

1...1...9:傳回九個在模式比對期間找到的、最近儲存的部分,隻讀。

input ($_):傳回執行規範表述查找的字元串,隻讀。

lastmatch ($&):傳回任何正規表達式搜尋過程中的最後比對的字元,隻讀。

lastparen ($+):如果有的話傳回任何正規表達式查找過程中最後括的子比對,隻讀。

leftcontext ($`):傳回被查找的字元串中從字元串開始位置到最後比對之前的位置之間的字元,隻讀。

rightcontext ($'),傳回被搜尋的字元串中從最後一個比對位置開始到字元串結尾之間的字元,隻讀。

string對象一些和正規表達式相關的方法

match:找到一個或多個正規表達式的比對。

replace:替換與正規表達式比對的子串。

search:檢索與正規表達式相比對的值。

split:把字元串分割為字元串數組。

每個regexp對象的執行個體具有lastindex屬性,它是被查找字元串中下一次成功比對的開始位置,預設值是-1。 lastindex 屬性被 regexp 對象的 exec 和 test 方法修改.并且它是可寫的;當比對失敗(後面沒有比對),或lastindex值大于字元串長度時,再執行exec等方法會将lastindex設為0(開始位置)

multiline屬性傳回正規表達式是否使用多行模式,這個屬性不針對某個正規表達式執行個體,而是針對所有正規表達式,并且這個屬性可寫.(ie與opera不支援這個屬性)

使用元字元注意事項:元字元是正規表達式的一部分,當我們要比對正規表達式本身時,必須對這些元字元轉義;下面是正規表達式用到的所有元字元( [ { ^ $ | ) ? * + .

使用regexp構造函數與使用正規表達式字面量建立正規表達式注意點

既然雙重轉義這麼不友好,是以還是用正規表達式字面量的聲明方式

另處,還有一些其它的預定義特殊字元,如下表所示:

字元

描述

n

換行符

r

回車符

t

制表符

f

換頁符(tab)

cx

與x對應的控制字元

b

倒退符(backspace)

v

垂直制表符

空字元("")

字元類 ---〉簡單類,反向類,範圍類,組合類,預定義類

下面是正規表達式中的預定義類

代碼

等同于

比對

.

比對除換行符之外的任何一個字元

d

[0-9]

比對數字

<a href="#fn-4">4</a>

比對非數字字元

s

[ nrtfx0b]

比對一個空白字元

<a href="#fn-5">5</a>

比對一個非空白字元

w

[a-za-z0-9_]

比對字母數字和下劃線

<a href="#fn-6">6</a>

比對除字母數字下劃線之外的字元

貪婪量詞與惰性量詞

?用貪婪量詞進行比對時,它首先會将整會字元串當成一個比對,如果比對的話就退出,如果不比對,就截去最後一個字元進行比對,如果不比對,繼續将最後一個字元截去進行比對,直到有比對為止。直到現在我們遇到的量詞都是貪婪量詞

?用惰性量詞進行比對時,它首先将第一個字元當成一個比對,如果成功則退出,如果失敗,則測試前兩個字元,依次增加,直到遇到合适的比對為止

惰性量詞僅僅在貪婪量詞後面加個"?"而已,如"a+"是貪婪比對的,"a+?"則是惰性的

繼續閱讀