- JavaScript從入門到精通(第3版)
- 明日科技
- 2605字
- 2020-03-20 10:37:37
7.3 RegExp對象
在JavaScript中,正則表達式是由RegExp對象表示的。利用RegExp對象可以完成有關正則表達式的操作和功能。
7.3.1 創(chuàng)建RegExp對象
每個正則表達式模式都對應一個RegExp實例。有兩種方式可以創(chuàng)建RegExp對象的實例,下面分別進行介紹。
(1)使用RegExp的顯式構(gòu)造函數(shù)
語法格式:
new RegExp("pattern"[,"flags"]) //即new RegExp(" 模式 "[," 標記 "])
(2)使用RegExp的隱式構(gòu)造函數(shù),采用純文本格式
語法格式:
/pattern/[flags]
Pattern參數(shù)為要使用的正則表達式模式文本,是必選項。在第一種方式中,pattern部分以JavaScript字符串的形式存在,需要使用雙引號或單引號括起來;在第二種方式中,pattern部分嵌套在兩個“/”之間,不能使用引號。
Flags參數(shù)用于設置正則表達式的標志信息,是可選項。如果設置flags部分,在第一種方式中,以字符串的形式存在;在第二種方式中,以文本的形式緊接在最后一個“/”字符之后。flags可以是以下標志字符的組合。
g是全局標志。如果設置了這個標志,對某個文本執(zhí)行搜索和替換操作時,將對文本中所有匹配的部分起作用。如果不設置這個標志,則僅搜索和替換最早匹配的內(nèi)容。
i是忽略大小寫標志。如果設置了這個標志,進行匹配比較時,將忽略大小寫。
m是多行標志。如果未設置多行標志,那么元字符“^”只與整個被搜索字符串的開始位置相匹配,元字符“$”只與被搜索字符串的結(jié)束位置相匹配。如果設置了多行標志,“^”還可以與被搜索字符串中的“\n”或“\r”之后的位置(即下一行的行首)相匹配,“$”還可以與被搜索字符串中的“\n”或“\r”之后的位置(即下一行的行尾)相匹配。
注意
文本格式中的參數(shù)不要使用引號標記,構(gòu)造器函數(shù)的參數(shù)要使用引號標記。所以,下面兩個表達式建立的是同樣的正則表達式。
/ab+c/i new RegExp("ab+c","i")
當使用構(gòu)造函數(shù)時,使用正常的字符串避開規(guī)則(在字符串中加入前導字符“\”)是必需的。例如,下面的兩條語句是等價的:
re = new RegExp("\\w+") re = /\w+/
【例7.6】 創(chuàng)建正則表達式。(實例位置:資源包\TM\sl\7\06)
運行結(jié)果如圖7.6所示。

圖7.6 創(chuàng)建正則表達式
代碼如下:

由于JavaScript字符串中“\”是一個轉(zhuǎn)義字符,因此,使用顯式構(gòu)造函數(shù)創(chuàng)建RegExp實例對象時,應將原始正則表達式中的“\”用“\\”替換,例如:

運行結(jié)果:
re1=/\d{2}/ re2=/\d{2}/
由于正則表達式模式文本中的轉(zhuǎn)義字符也是“\”,因此,如果正則表達式中要匹配原義字符“\”,在正則表達式模式文本中要以“\\”來表示;當使用顯式構(gòu)造函數(shù)的方式創(chuàng)建RegExp實例對象時,就需要使用“\\\\”來表示原義字符“\”,例如:
var re = new RegExp("\\\\")
7.3.2 RegExp對象的屬性
RegExp對象的屬性分為靜態(tài)屬性和實例屬性,下面分別進行介紹。
1.靜態(tài)屬性
RegExp對象的靜態(tài)屬性包括index、input、lastIndex、lastMatch、lastParen、leftContext、rightContext以及$1…$9。
index屬性:是當前表達式模式首次匹配內(nèi)容的開始位置,從0開始計數(shù)。其初始值為-1,每次成功匹配時,index屬性都會隨之改變。
input屬性:返回當前所作用的字符串,可以簡寫為$_,初始值為空字符串("")。
lastIndex屬性:當前表達式模式首次匹配內(nèi)容中最后一個字符的下一個位置。從0開始計數(shù),常被作為繼續(xù)搜索時的起始位置。初始值為-1,表示從起始位置開始搜索。每次成功匹配時,lastIndex屬性值都會隨之改變。
lastMatch屬性:當前表達式模式的最后一個匹配字符串,可以簡寫為$&。其初始值為空字符串("")。每次成功匹配時,lastMatch屬性值都會隨之改變。
lastParen屬性:如果表達式模式中有括起來的子匹配,是當前表達式模式中最后的子匹配所匹配到的子字符串,可以簡寫為$+。其初始值為空字符串("")。每次成功匹配時,lastParen屬性值都會隨之改變。
leftContext屬性:當前表達式模式最后一個匹配字符串左邊的所有內(nèi)容,可以簡寫為$`(其中“`”為鍵盤上Esc鍵下邊的反單引號)。初始值為空字符串("")。每次成功匹配時,其屬性值都會隨之改變。
rightContext屬性:當前表達式模式最后一個匹配字符串右邊的所有內(nèi)容,可以簡寫為$’。初始值為空字符串("")。每次成功匹配時,其屬性值都會隨之改變。
$1…$9屬性:這些屬性是只讀的。如果表達式模式中有括起來的子匹配,$1…$9屬性值分別是第1~9個子匹配所捕獲到的內(nèi)容。如果有超過9個以上的子匹配,$1…$9屬性分別對應最后的9個子匹配。在一個表達式模式中,可以指定任意多個帶括號的子匹配,但RegExp對象只能存儲最后9個子匹配的結(jié)果。在RegExp實例對象一些方法返回的結(jié)果數(shù)組中,可以獲得所有圓括號內(nèi)的子匹配結(jié)果。
2.實例屬性
RegExp的實例有幾個只讀的屬性,其中global表示是否為全局匹配,ignoreCase表示是否忽略大小寫,multiline表示是否為多行匹配,source是正則式的源文本,如“/[ab]/g”的源文本就是“[ab]”。另外,還有一個可寫的屬性是lastIndex,表示下次執(zhí)行匹配時的起始位置。下面對這幾種屬性進行詳細說明。
global屬性:返回創(chuàng)建RegExp對象實例時指定的global標志(g)的狀態(tài)。如果創(chuàng)建RegExp對象實例時設置了g標志,該屬性返回true,否則返回false,默認值為false。
ignoreCase屬性:返回創(chuàng)建RegExp對象實例時指定的ignoreCase標志(i)的狀態(tài)。如果創(chuàng)建RegExp對象實例時設置了i標志,該屬性返回true,否則返回false,默認值為false。
multiline屬性:返回創(chuàng)建RegExp對象實例時指定的multiline標志(m)的狀態(tài)。如果創(chuàng)建RegExp對象實例時設置了m標志,該屬性返回true,否則返回false,默認值為false。
source屬性:返回創(chuàng)建RegExp對象實例時指定的表達式文本字符串。
7.3.3 RegExp對象的方法
1.exec()方法
exec()方法用正則表達式模式在字符串中進行查找,并返回包含該查找結(jié)果的一個數(shù)組。
語法格式:
rgExp.exec(str)
參數(shù)說明:
rgExp:必選項,包含正則表達式模式和可用標志的正則表達式對象。
str:必選項,要在其中執(zhí)行查找的String對象或字符串文字。
如果exec()方法沒有找到匹配,則返回null;如果找到匹配,則返回一個數(shù)組,并更新全局RegExp對象的屬性,以反映匹配結(jié)果。數(shù)組的0元素包含了完整的匹配,而第1~n元素中包含的是匹配中出現(xiàn)的任意一個子匹配。這相當于沒有設置全局標志(g)的match()方法。
如果為正則表達式設置了全局標志,exec()方法將從lastIndex值指示的位置開始查找;如果沒有設置全局標志,exec()方法將忽略lastIndex的值,從字符串的起始位置開始搜索。
exec()方法返回的數(shù)組有兩個屬性,分別是input和index。input屬性包含了整個被查找的字符串,index屬性包含了整個被查找字符串中符合匹配的子字符串的位置。
例如,下面應用exec()方法來返回一個數(shù)組,代碼如下:

運行結(jié)果:
0-1I 2-3m 4-5a 6-10good 11-14boy
2.test()方法
test()方法返回一個Boolean值,指出在被查找的字符串中是否存在模式。
語法格式:
rgexp.test(str)
參數(shù)說明:
rgexp:必選項,表示包含正則表達式模式或可用標志的正則表達式對象。
str:必選項,表示要在其上測試查找的字符串。
說明
test()方法用于檢查字符串中是否存在某個模式,如果存在則返回true,否則返回false。test()方法不修改全局RegExp對象的屬性。
例如,下面應用test()方法查詢指定字符串是否存在,代碼如下:

函數(shù)調(diào)用語句:
document.write (TestDemo(/boy+/ ,"I am a good boy !"));
運行結(jié)果:
'I am a good boy !' contains 'boy+'
- 自己動手寫Java虛擬機
- Learning RabbitMQ
- Implementing Cisco Networking Solutions
- Learning Laravel 4 Application Development
- 名師講壇:Java微服務架構(gòu)實戰(zhàn)(SpringBoot+SpringCloud+Docker+RabbitMQ)
- Android Native Development Kit Cookbook
- Serverless架構(gòu)
- Hands-On Natural Language Processing with Python
- 批調(diào)度與網(wǎng)絡問題的組合算法
- Scala Reactive Programming
- Java SE實踐教程
- UX Design for Mobile
- Python預測之美:數(shù)據(jù)分析與算法實戰(zhàn)(雙色)
- C/C++代碼調(diào)試的藝術(第2版)
- HTML5 WebSocket權(quán)威指南