JavaScript使用Regex

來源:互聯網
上載者:User
Regex概述
在前面已經涉及了一些Regex的用法,現在將系統地學習Regex的文法和用途。Regex主要用於進行字串的模式比對,例如判斷一個字串是否符合指定格式等。例如在windows下搜尋檔案,可以用“*”或者“?”這樣的萬用字元。在Regex的文法中,有更多這樣的符號用於表示一個字串的模式,表7.1列出了所有的特殊符號,它們也被稱為元字元。

表7.1 Regex中的元字元

 

字 符

說 明

\

將下一字元標記為特殊字元、文本、反向引用或八進位轉義符。例如,“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”在內的任一字元,請使用諸如“[\s\S]”之類的模式

 

續表

 

字 符

說 明

(pattern)

匹配 pattern 並捕獲該匹配的子運算式。可以使用 $0...$9 屬性從結果“匹配”集合中檢索捕獲的匹配。若要匹配括弧字元 ( ),請使用“\(”或者“\)”

(?:pattern)

匹配 pattern 但不捕獲該匹配的子運算式,即它是一個非捕獲匹配,不儲存供以後使用的匹配。這對於用“或”字元 (|) 組合模式組件的情況很有用。例如,與“industry|industries”相比,“industr(?:y| ies)”是一個更加經濟的運算式

(?=pattern)

執行正向預測先行搜尋的子運算式,該運算式匹配處於匹配 pattern 的字串的起始點的字串。它是一個非捕獲匹配,即不能捕獲供以後使用的匹配。例如,“Windows (?=95| 98| NT| 2000)”與“Windows 2000”中的“Windows”匹配,但不與“Windows 3.1”中的“Windows”匹配。預測先行不佔用字元,即發生匹配後,下一匹配的搜尋緊隨上一匹配之後,而不是在組成預測先行的字元後

(?!pattern)

執行反向預測先行搜尋的子運算式,該運算式匹配不處於匹配 pattern 的字串的起始點的搜尋字串。它是一個非捕獲匹配,即不能捕獲供以後使用的匹配。例如,“Windows (?!95| 98| NT| 2000)”與“Windows 3.1”中的“Windows”匹配,但不與“Windows 2000”中的“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”

\cx

匹配由 x 指示的控制字元。例如,\cM 匹配一個 Control-M 或斷行符號符。x 的值必須在 A-Z 或 a-z 之間。如果不是這樣,則假定c就是“c”字元本身

\d

數字字元匹配。等效於 [0-9]

\D

非數字字元匹配。等效於 [^0-9]

\f

換頁符匹配。等效於 \x0c 和 \cL

\n

分行符號匹配。等效於 \x0a 和 \cJ

\r

匹配一個斷行符號符。等效於 \x0d 和 \cM

\s

匹配任何空白字元,包括空格、定位字元、換頁符等。與 [ \f\n\r\t\v] 等效

\S

匹配任何非空白字元。等價於 [^ \f\n\r\t\v]

\t

定位字元匹配。與 \x09 和 \cI 等效

 

續表

 

字 符

說 明

\v

垂直定位字元匹配。與 \x0b 和 \cK 等效

\w

匹配任何字類字元,包括底線。與“[A-Za-z0-9_]”等效。

\W

任何非字字元匹配。與“[^A-Za-z0-9_]”等效

\xn

匹配n,此處的n是一個十六進位轉義碼。十六進位轉義碼必須正好是兩位元長。例如,“\x41”匹配“A”。“\x041”與“\x04”&“1”等效。允許在Regex中使用 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 匹配著作權符號 (?)

 

使用這些元字元,可以表示具有特定模式的字串,例如:
/^\s*$/:匹配一個空行。
/\d{2}-\d{5}/:匹配由兩位元字、一個連字號再加5位元字組成的ID號。
/<\s* (\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/:匹配HTML標記。
像這種以斜杠開始和結尾的字元序列稱為Regex,在JavaScript中可以很方便地使用這些運算式。
使用RegExp對象執行字串模式比對
RegExp是JavaScript中的Regex對象,利用它可以完成字串匹配的各種操作。獲得一個RegExp對象可以有兩種方式:
var objRegExp=/pattern*/[flag]
//或者
var objRegExp=new RegExp("pattern" [,"flag"]);
其中pattern是要匹配的模式,flag表示搜尋模式,有兩個選擇性參數,分別是g和i。g表示全域搜尋,在後面介紹的replace方法中非常有用;i表示忽略大小寫,預設情況下是大小寫敏感的。例如:
/jack/ig
new RegExp("jack","ig");
都表示全域匹配文本中的“jack”單詞,並且忽略大小寫。
使用這兩種建立方式的效果完全一樣,可以直接使用。第一種方式甚至不需要引用變數,而直接把Regex當作對象來使用,例如:
/jack/ig.test(sourceString);
其中test就是Regex對象的一個方法,表7.2列出了Regex的所有方法。

表7.2 Regex對象RegExp的方法

 

方 法

描 述

compile(pattern,flags)

將Regex轉換為內部格式,對於批量匹配可以提高匹配效率

exec(str)

按照RegExp對象的匹配模式對str字串進行匹配尋找,當設定了全域搜尋模式(g),則匹配尋找從RegExp對象lastIndex屬性所指定的目標字串位置開始;若沒有設定全域搜尋,則從目標字串第一個字元開始搜尋。若沒有任何匹配發生,返回null。

該方法將匹配結果放在一個數組內返回,該數組有3個屬性

input:包含目標字串,同RegExp.index

index:匹配到的子字串在目標字串中的位置,同RegExp.index

lastIndex:匹配到的子字串後面一個字元的位置,同RegExp.lastIndex

test(str)

判斷str是否符合指定的模式,返回一個布爾變數,true或者false。需要注意,這個方法不會改變RegExp的屬性值

 

在執行完字串匹配後,匹配結果會以RegExp靜態屬性的方式提供給指令碼程式,每次執行exec都會改變這些靜態屬性,表7.3列出了RegExp對象的靜態屬性。

表7.3 Regex對象RegExp的靜態屬性

 

靜 態 屬 性

描 述

RegExp.input

儲存被搜尋的字串

RegExp.index

儲存匹配的首字元的位置

RegExp.lastIndex

儲存匹配的字串下一個字元的位置

RegExp.lastMatch

儲存匹配到的字串

RegExp.lastParen

儲存最後一個被匹配的字串(最後一個括弧的內容)

RegExp.leftContext

儲存匹配字串左邊的內容

RegExp.rightContext

儲存匹配字串右邊的內容

RegExp.$1~$9

儲存最開始的9個子匹配(括弧中的內容)

由此可見,所有的匹配結果都儲存在同一個位置,當執行exec方法後,這些靜態屬性就會改變。因此,必須確保在執行完匹配後立即去使用匹配結果,或將它們儲存到另外的變數中,而不再使用RegExp的這些屬性。
提取子字串
在匹配模式中,可以用小括弧將子模式括起來,以擷取子匹配的內容,這些匹配的結果被儲存在RegExp.$1~RegExp.$9中。例如,對於xml片斷:
<author>jack</author>
如果要使用Regex擷取其中的作者:jack,可以這樣實現:
<script language="JavaScript" type="text/javascript">
<!--
var strXml="<author>jack</author>";
var regExp=/<author>(\w*)<\/author>/;
regExp.exec(strXml);
var author=RegExp.$1;
alert(author);
//-->
</script>
當需要提取多個子模式時,可以使用RegExp.$1~RegExp.$9依次擷取得到的子字串。如果需要得到的子模式不只9個,也可以使用exec返回的數組來擷取子字串。返回數組的長度為子模式的個數加1,其中數組索引為0的元素表示被搜尋的字串,其後的元素依次對應於模式中的括弧。例如上面的例子也可以用下面的代碼實現:
<script language="JavaScript" type="text/javascript">
<!--
var strXml="<author>jack</author>";
var regExp=/<author>(\w*)<\/author>/;
//exec返回一個數組對象
var arr=regExp.exec(strXml);
var author=arr[1];
alert(author);
//-->
</script>
和字串相關的操作
在前面講字串相關的操作時,有3個方法的參數需要用到Regex,下面給出它們的具體用法。
1.string.search(regularExpression)
其中string是要處理的字串,regularExpression是匹配模式。該方法在string中尋找指定的模式,如果找到,則返回它的第一個字元的索引位置,否則返回-1。例如:
<script language="JavaScript" type="text/javascript">
<!--
var strXml="<author>jack</author>";
var i=strXml.search(/jack/);
alert(i);
//-->
</script>
這段代碼的最後結果顯示為8。和indexOf方法不同,該方法接收的是一個Regex,而indexOf只能接收一個字串。但兩者的行為是類似的。
2.string.replace(regularExpression,replaceString)
其中regularExpression是要尋找的模式,replaceString是要替換匹配模式的字串。regularExpression也可以用一般字元串,但那樣只能替換第一個出現的匹配,之後的匹配則被忽略。使用Regex後可以使用全域模式來實現整個替換。替換後原有字串不發生變化,而是返回一個新的字串。例如:在實際開發中經常要刪除一段文本中的HTML標記,以擷取純文字,可以使用如下代碼實現。
<script language="JavaScript" type="text/javascript">
<!--
//定義函數用於刪除文本中的Html標記
function stripTags(s) { 
     return s.replace(/<\/?[^>]+>/gi, ''); 
}

 

var str=stripTags("<author>jack</author>");
alert(str);
//-->
</script>
最後,將得到去掉Html標記後的文本“jack”。
3.string.match(regularExpression)
該方法根據regularExpressionRegex模式尋找字串string中的匹配字元項,將結果以數組形式返回。該數組有3個屬性值,與exec方法返回的數組屬性相同。若沒有任何匹配,返回null。

注意:若regularExpression對象未設定全域匹配模式,則數組索引為0的元素就是匹配的整體內容,索引為1~9的元素則包含了子匹配得到的字元。若設定了全域模式,則數組包含了搜尋到的所有整體匹配項。


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.