當前位置:編程學習大全網 - 熱門推薦 - javascript中的正則表達式有什麽規範

javascript中的正則表達式有什麽規範

正則表達式規則

1. 正則表達式規則

1.1 普通字符

字母、數字、漢字、下劃線、以及後邊章節中沒有特殊定義的標點符號,都是"普通字符"。表達式中的普通字符,在匹配壹個字符串的時候,匹配與之相同的壹個字符。

舉例1:表達式 "c",在匹配字符串 "abcde" 時,匹配結果是:成功;匹配到的內容是:"c";匹配到的位置是:開始於2,結束於3。(註:下標從0開始還是從1開始,因當前編程語言的不同而可能不同)

舉例2:表達式 "bcd",在匹配字符串 "abcde" 時,匹配結果是:成功;匹配到的內容是:"bcd";匹配到的位置是:開始於1,結束於4。

--------------------------------------------------------------------------------

1.2 簡單的轉義字符

壹些不便書寫的字符,采用在前面加 "\" 的方法。這些字符其實我們都已經熟知了。

表達式

可匹配

\r, \n

代表回車和換行符

\t

制表符

\\

代表 "\" 本身

還有其他壹些在後邊章節中有特殊用處的標點符號,在前面加 "\" 後,就代表該符號本身。比如:^, $ 都有特殊意義,如果要想匹配字符串中 "^" 和 "$" 字符,則表達式就需要寫成 "\^" 和 "\$"。

表達式

可匹配

\^

匹配 ^ 符號本身

\$

匹配 $ 符號本身

\.

匹配小數點(.)本身

這些轉義字符的匹配方法與 "普通字符" 是類似的。也是匹配與之相同的壹個字符。

舉例1:表達式 "\$d",在匹配字符串 "abc$de" 時,匹配結果是:成功;匹配到的內容是:"$d";匹配到的位置是:開始於3,結束於5。

--------------------------------------------------------------------------------

1.3 能夠與 '多種字符' 匹配的表達式

正則表達式中的壹些表示方法,可以匹配 '多種字符' 其中的任意壹個字符。比如,表達式 "\d" 可以匹配任意壹個數字。雖然可以匹配其中任意字符,但是只能是壹個,不是多個。這就好比玩撲克牌時候,大小王可以代替任意壹張牌,但是只能代替壹張牌。

表達式

可匹配

\d

任意壹個數字,0~9 中的任意壹個

\w

任意壹個字母或數字或下劃線,也就是 A~Z,a~z,0~9,_ 中任意壹個

\s

包括空格、制表符、換頁符等空白字符的其中任意壹個

.

小數點可以匹配除了換行符(\n)以外的任意壹個字符

舉例1:表達式 "\d\d",在匹配 "abc123" 時,匹配的結果是:成功;匹配到的內容是:"12";匹配到的位置是:開始於3,結束於5。

舉例2:表達式 "a.\d",在匹配 "aaa100" 時,匹配的結果是:成功;匹配到的內容是:"aa1";匹配到的位置是:開始於1,結束於4。

--------------------------------------------------------------------------------

1.4 自定義能夠匹配 '多種字符' 的表達式

使用方括號 [ ] 包含壹系列字符,能夠匹配其中任意壹個字符。用 [^ ] 包含壹系列字符,則能夠匹配其中字符之外的任意壹個字符。同樣的道理,雖然可以匹配其中任意壹個,但是只能是壹個,不是多個。

表達式

可匹配

[ab5@]

匹配 "a" 或 "b" 或 "5" 或 "@"

[^abc]

匹配 "a","b","c" 之外的任意壹個字符

[f-k]

匹配 "f"~"k" 之間的任意壹個字母

[^A-F0-3]

匹配 "A"~"F","0"~"3" 之外的任意壹個字符

舉例1:表達式 "[bcd][bcd]" 匹配 "abc123" 時,匹配的結果是:成功;匹配到的內容是:"bc";匹配到的位置是:開始於1,結束於3。

舉例2:表達式 "[^abc]" 匹配 "abc123" 時,匹配的結果是:成功;匹配到的內容是:"1";匹配到的位置是:開始於3,結束於4。

--------------------------------------------------------------------------------

1.5 修飾匹配次數的特殊符號

前面章節中講到的表達式,無論是只能匹配壹種字符的表達式,還是可以匹配多種字符其中任意壹個的表達式,都只能匹配壹次。如果使用表達式再加上修飾匹配次數的特殊符號,那麽不用重復書寫表達式就可以重復匹配。

使用方法是:"次數修飾"放在"被修飾的表達式"後邊。比如:"[bcd][bcd]" 可以寫成 "[bcd]{2}"。

表達式

作用

{n}

表達式重復n次,比如:"\w{2}" 相當於 "\w\w";"a{5}" 相當於 "aaaaa"

{m,n}

表達式至少重復m次,最多重復n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"

{m,}

表達式至少重復m次,比如:"\w\d{2,}"可以匹配 "a12","_456","M12344"...

匹配表達式0次或者1次,相當於 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"

+

表達式至少出現1次,相當於 {1,},比如:"a+b"可以匹配 "ab","aab","aaab"...

*

表達式不出現或出現任意次,相當於 {0,},比如:"\^*b"可以匹配 "b","^^^b"...

舉例1:表達式 "\d+\.?\d*" 在匹配 "It costs $12.5" 時,匹配的結果是:成功;匹配到的內容是:"12.5";匹配到的位置是:開始於10,結束於14。

舉例2:表達式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 時,匹配的結果是:成功;匹配到的內容是:"goooooogle";匹配到的位置是:開始於7,結束於17。

--------------------------------------------------------------------------------

1.6 其他壹些代表抽象意義的特殊符號

壹些符號在表達式中代表抽象的特殊意義:

表達式

作用

^

與字符串開始的地方匹配,不匹配任何字符

$

與字符串結束的地方匹配,不匹配任何字符

\b

匹配壹個單詞邊界,也就是單詞和空格之間的位置,不匹配任何字符

進壹步的文字說明仍然比較抽象,因此,舉例幫助大家理解。

舉例1:表達式 "^aaa" 在匹配 "xxx aaa xxx" 時,匹配結果是:失敗。因為 "^" 要求與字符串開始的地方匹配,因此,只有當 "aaa" 位於字符串的開頭的時候,"^aaa" 才能匹配,比如:"aaa xxx xxx"。

舉例2:表達式 "aaa$" 在匹配 "xxx aaa xxx" 時,匹配結果是:失敗。因為 "$" 要求與字符串結束的地方匹配,因此,只有當 "aaa" 位於字符串的結尾的時候,"aaa$" 才能匹配,比如:"xxx xxx aaa"。

舉例3:表達式 ".\b." 在匹配 "@@@abc" 時,匹配結果是:成功;匹配到的內容是:"@a";匹配到的位置是:開始於2,結束於4。

進壹步說明:"\b" 與 "^" 和 "$" 類似,本身不匹配任何字符,但是它要求它在匹配結果中所處位置的左右兩邊,其中壹邊是 "\w" 範圍,另壹邊是 非"\w" 的範圍。

舉例4:表達式 "\bend\b" 在匹配 "weekend,endfor,end" 時,匹配結果是:成功;匹配到的內容是:"end";匹配到的位置是:開始於15,結束於18。

壹些符號可以影響表達式內部的子表達式之間的關系:

表達式

作用

|

左右兩邊表達式之間 "或" 關系,匹配左邊或者右邊

( )

(1). 在被修飾匹配次數的時候,括號中的表達式可以作為整體被修飾

(2). 取匹配結果的時候,括號中的表達式匹配到的內容可以被單獨得到

舉例5:表達式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 時,匹配結果是:成功;匹配到的內容是:"Tom";匹配到的位置是:開始於4,結束於7。匹配下壹個時,匹配結果是:成功;匹配到的內容是:"Jack";匹配到的位置時:開始於15,結束於19。

舉例6:表達式 "(go\s*)+" 在匹配 "Let's go go go!" 時,匹配結果是:成功;匹配到內容是:"go go go";匹配到的位置是:開始於6,結束於14。

舉例7:表達式 "¥(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 時,匹配的結果是:成功;匹配到的內容是:"¥20.5";匹配到的位置是:開始於6,結束於10。單獨獲取括號範圍匹配到的內容是:"20.5"。

--------------------------------------------------------------------------------

2. 正則表達式中的壹些高級規則

2.1 匹配次數中的貪婪與非貪婪

在使用修飾匹配次數的特殊符號時,有幾種表示方法可以使同壹個表達式能夠匹配不同的次數,比如:"{m,n}", "{m,}", "?", "*", "+",具體匹配的次數隨被匹配的字符串而定。這種重復匹配不定次數的表達式在匹配過程中,總是盡可能多的匹配。比如,針對文本 "dxxxdxxxd",舉例如下:

表達式

匹配結果

(d)(\w+)

"\w+" 將匹配第壹個 "d" 之後的所有字符 "xxxdxxxd"

(d)(\w+)(d)

"\w+" 將匹配第壹個 "d" 和最後壹個 "d" 之間的所有字符 "xxxdxxx"。雖然 "\w+" 也能夠匹配上最後壹個 "d",但是為了使整個表達式匹配成功,"\w+" 可以 "讓出" 它本來能夠匹配的最後壹個 "d"

由此可見,"\w+" 在匹配的時候,總是盡可能多的匹配符合它規則的字符。雖然第二個舉例中,它沒有匹配最後壹個 "d",但那也是為了讓整個表達式能夠匹配成功。同理,帶 "*" 和 "{m,n}" 的表達式都是盡可能地多匹配,帶 "?" 的表達式在可匹配可不匹配的時候,也是盡可能的 "要匹配"。這 種匹配原則就叫作 "貪婪" 模式 。

非貪婪模式:

在修飾匹配次數的特殊符號後再加上壹個 "?" 號,則可以使匹配次數不定的表達式盡可能少的匹配,使可匹配可不匹配的表達式,盡可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強" 模式。如果少匹配就會導致整個表達式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配壹些,以使整個表達式匹配成功。舉例如下,針對文本 "dxxxdxxxd" 舉例:

表達式

匹配結果

(d)(\w+?)

"\w+?" 將盡可能少的匹配第壹個 "d" 之後的字符,結果是:"\w+?" 只匹配了壹個 "x"

(d)(\w+?)(d)

為了讓整個表達式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以讓後邊的 "d" 匹配,從而使整個表達式匹配成功。因此,結果是:"\w+?" 匹配 "xxx"

更多的情況,舉例如下:

舉例1:表達式 "<td>(.*)</td>" 與字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配時,匹配的結果是:成功;匹配到的內容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整個字符串, 表達式中的 "</td>" 將與字符串中最後壹個 "</td>" 匹配。

舉例2:相比之下,表達式 "<td>(.*?)</td>" 匹配舉例1中同樣的字符串時,將只得到 "<td><p>aa</p></td>", 再次匹配下壹個時,可以得到第二個 "<td><p>bb</p></td>"。

--------------------------------------------------------------------------------

2.2 反向引用 \1, \2...

表達式在匹配時,表達式引擎會將小括號 "( )" 包含的表達式所匹配到的字符串記錄下來。在獲取匹配結果的時候,小括號包含的表達式所匹配到的字符串可以單獨獲取。這壹點,在前面的舉例中,已經多次展示了。在實際應用場合中,當用某種邊界來查找,而所要獲取的內容又不包含邊界時,必須使用小括號來指定所要的範圍。比如前面的 "<td>(.*?)</td>"。

其實,"小括號包含的表達式所匹配到的字符串" 不僅是在匹配結束後才可以使用,在匹配過程中也可以使用。表達式後邊的部分,可以引用前面 "括號內的子匹配已經匹配到的字符串"。引用方法是 "\" 加上壹個數字。"\1" 引用第1對括號內匹配到的字符串,"\2" 引用第2對括號內匹配到的字符串……以此類推,如果壹對括號內包含另壹對括號,則外層的括號先排序號。換句話說,哪壹對的左括號 "(" 在前,那這壹對就先排序號。

舉例如下:

舉例1:表達式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 時,匹配結果是:成功;匹配到的內容是:" 'Hello' "。再次匹配下壹個時,可以匹配到 " "World" "。

舉例2:表達式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 時,匹配結果是:成功;匹配到的內容是 "ccccc"。再次匹配下壹個時,將得到 999999999。這個表達式要求 "\w" 範圍的字符至少重復5次,註意與 "\w{5,}" 之間的區別。

舉例3:表達式 "<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 時,匹配結果是成功。如果 "<td>" 與 "</td>" 不配對,則會匹配失敗;如果改成其他配對,也可以匹配成功。

正則表達式規則如下:

表達式 描述 表達式 描述

^ 匹配行首 $ 匹配行尾

. 匹配任何單個字符 [] 匹配集合中的字符

[^] 匹配不在集合中的字符 ? 匹配前壹個樣式0或1次

* 匹配前壹個樣式0或更多次 + 匹配前壹個樣式1或更多次

| 匹配前壹個或後壹個樣式 & 匹配前壹個樣式0或更多次

# 匹配前壹個樣式1或更多次 {} Group char to form one pattern

() Group and remember \ 下壹個字符直接用原意(只對a-z之外的字符有效)

< 匹配詞的開始 > 匹配詞的結尾

\x## 匹配ASCII碼為##(16進制)的字符 \N### 匹配ASCII碼為##(10進制)的字符

\o### 匹配ASCII碼為##(8進制)的字符 \a 匹配 \a

\b 匹配 \b \f 匹配 \f

\r 匹配 0x13(回車) \t 匹配 0x09(跳格)

\v 匹配 \v \e 匹配 Esc(0x05)

\n 匹配0x10(換行) \s 匹配空格(回車,換行,制表符,空格)

\S 匹配非空格(!\s) \w 整字匹配

\W 非整字匹配 \d 匹配數字

\D 匹配非數字 \U 匹配大寫字母

\L 匹配小寫字母 \C 後面開始大小寫敏感

\c 後面開始大小寫不敏感 \# 匹配前面定義的組(#: 1-9, a-f)

  • 上一篇:誰可以給壹些守護甜心的圖片?在介紹壹下就好了!(名字)
  • 下一篇:電視劇征服
  • copyright 2024編程學習大全網