JavaScript正則表達式詳解(一)正則表達式入門

JavaScript正則表達式是不少JavaScript開發人員比較頭疼的事情,也不少人不肯意學習,只是必要的時候上網查一下就能夠啦~本文中詳細的把JavaScript正則表達式的用法進行了列表,但願對於你們學習JavaScript正則表達式有必定的幫助。javascript

創建正則表達式對象語法php

re = new RegExp(/pattern/[flags])

flags 參數說明: html

  • g (全文查找出現的全部 pattern
  • i (忽略大小寫)
  • m (多行查找)
普通字符 描述
\ 將下一個字符標記爲一個特殊字符、或一個原義字符、或一個 後向引用、或一個八進制轉義符。例如,’n’ 匹配字符 「n」。’\n’ 匹配一個換行符。序列 ‘\\’ 匹配 「\」 而 「\(」 則匹配 「(」。
. 匹配除 「\n」 以外的任何單個字符。要匹配包括 ‘\n’ 在內的任何字符,請使用象 ‘[.\n]‘ 的模式。
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’ 範圍內的任意字符。
\cx 匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。 x 的值必須爲 A-Z 或 a-z 之一。不然,將 c 視爲一個原義的 ‘c’ 字符。
\d 匹配一個數字字符。等價於 [0-9]。
\D 匹配一個非數字字符。等價於 [^0-9]。
\w 匹配包括下劃線的任何單詞字符。等價於’[A-Za-z0-9_]‘。
\W 匹配任何非單詞字符。等價於 ‘[^A-Za-z0-9_]‘。
\xn 匹配 n,其中 n 爲十六進制轉義值。十六進制轉義值必須爲肯定的兩個數字長。例如, ‘\x41′ 匹配 「A」。’\x041′ 則等價於 ‘\x04′ & 「1″。正則表達式中可使用 ASCII 編碼。.
\num 匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。例如,’(.)\1′ 匹配兩個連續的相同字符。
\n 標識一個八進制轉義值或一個後向引用。若是 \n 以前至少 n 個獲取的子表達式,則 n 爲後向引用。不然,若是 n 爲八進制數字 (0-7),則n 爲一個八進制轉義值。
\nm 標識一個八進制轉義值或一個後向引用。若是 \nm 以前至少有is preceded by at least 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 匹配版權符號 (?)。

 

特殊字符 說明
$ 匹配輸入字符串的結尾位置。若是設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符自己,請使用 \$。
( ) 標記一個子表達式的開始和結束位置。子表達式能夠獲取供之後使用。要匹配這些字符,請使用 \( 和 \)。
* 匹配前面的子表達式零次或屢次。要匹配 * 字符,請使用 \*。
+ 匹配前面的子表達式一次或屢次。要匹配 + 字符,請使用 +。
. 匹配除換行符 \n以外的任何單字符。要匹配 .,請使用 \。
[ 標記一箇中括號表達式的開始。要匹配 [,請使用 \[。
? 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \?。
\ 將下一個字符標記爲或特殊字符、或原義字符、或後向引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\' 匹配 "\",而 '\(' 則匹配 "("。
^ 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符自己,請使用\^。
{ 標記限定符表達式的開始。要匹配 {,請使用 \{。
| 指明兩項之間的一個選擇。要匹配 |,請使用 \|。

 

非打印字符 含義
\cx 匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。 x 的值必須爲 A-Z 或 a-z 之一。不然,將 c 視爲一個原義的 'c' 字符。
\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。

 

限定符 描述
* 匹配前面的子表達式零次或屢次。例如,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?’。請注意在逗號和兩個數之間不能有空格。

 

定位符 描述
^ 匹配輸入字符串的開始位置。若是設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 ‘\n’ 或 ‘\r’ 以後的位置。
$ 匹配輸入字符串的結束位置。若是設置了RegExp 對象的 Multiline 屬性,$ 也匹配 ‘\n’ 或 ‘\r’ 以前的位置。
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。
\B 匹配非單詞邊界。

 


 

1、正則表達式入門

什麼是正則表達式?java

這個問題能夠參見:「正則表達式30分鐘入門教程」,不少編程語言都支持正則表達式,本文僅僅討論JavaScript中的正則表達式。正則表達式

建立一個正則表達式編程

第一種方法:編程語言

var reg = /pattern/;

第二種方法:ide

var reg = new  RegExp('pattern');

正則表達式的exec()方法簡介(爲方便下面學習測試正則表達式用!!!)函數

語法:學習

reg.exec(str);

其中str爲要執行正則表達式的目標字符串。

例如:

<script  type="text/javascript">
var reg = /test/;
var str = 'testString';
var result = reg.exec(str);
alert(result);
</script>

將會輸出test,由於正則表達式reg會匹配str(‘testString’)中的’test’子字符串,而且將其返回。

咱們使用下面的函數來作匹配正則的練習:

function execReg(reg,str){
	var result = reg.exec(str);
	alert(result);
}

函數接受一個正則表達式參數reg和一個目標字符串參數str,執行以後會alert出正則表達式與字符串的匹配結果。

用這個函數測試上面的例子就是:

<script type="text/javascript">
function execReg(reg, str) {
	var result = reg.exec(str);
	alert(result);
}
var reg = /test/;
var str = 'testString';
execReg(reg,str);
</script>

上面的例子用正則裏的test去匹配字符串裏的test,實在是很無聊,一樣的任務用indexOf方法就能夠完成了。用正則,天然是要完成更強大的功能。

一片兩片三四片,落盡正則全不見(開始正則表達式簡介)

上面的小標題翻譯成正則就是{1},{2},{3,4},{1,}。

c{n}

{1}表示一個的意思。

/c{1}/只能匹配一個c。

/c{2}/則會匹配兩個連續的c。

以此類推,

/c{n}/則會匹配n個連續的c。

看下面的例子:

reg = /c{1}/;
str = 'cainiao';
execReg(reg, str);

返回結果c

reg = /c{2}/;
str = 'cainiao';
execReg(reg, str);

返回結果null,表示沒有匹配成功。

reg = /c{2}/;
str = 'ccVC果凍爽';
execReg(reg, str);

返回結果cc。

c{m,n}

c{3,4}的意思是,連續的3個c或者4個c。

例如

reg = /c{3,4}/;
str = 'ccVC果凍爽';
execReg(reg, str);

返回結果null,表示沒有匹配成功。

reg = /c{3,4}/;
str = 'cccTest';
execReg(reg, str);

結果返回ccc。

reg = /c{3,4}/;
str = 'ccccTest';
execReg(reg, str);

結果返回cccc,這代表正則會盡可能多品牌,可3可4的時候它會選擇多匹配一個。

reg = /c{3,4}/;
str = 'cccccTest';
execReg(reg, str);

仍然只匹配4個c。

由以上例子能夠推斷出,c{m,n}表示m個到n個c,且m小於等於n。

c{n,}

c{1,}表示1個以上的c。例如:

reg = /c{1,}/;
str = 'cainiao';
execReg(reg, str);

結果返回c。

reg = /c{1,}/;
str = 'cccccTest';
execReg(reg, str);

返回ccccc,再次說明了正則表達式會盡可能多地匹配。

reg = /c{2,}/;
str = 'cainiao';
execReg(reg, str);

結果返回null,c{2,}表示2個以上的c,而cainiao中只有1個c。

由以上例子可知,c{n,}表示最少n個c,最多則不限個數。

*,+,?

*表示0次或者屢次,等同於{0,},即

c* 和 c{0,} 是一個意思。

+表示一次或者屢次,等同於{1,},即

c+ 和 c{1,} 是一個意思。

最後,?表示0次或者1次,等同於{0,1},即

c? 和 c{0,1} 是一個意思。

貪心與非貪心

人都是貪婪的,正則也是如此。咱們在例子reg = /c{3,4}/;str=’ccccTest’;的例子中已經看到了,能匹配四個的時候,正則絕對不會去匹配三個。上面所介紹的全部的正則都是這樣,只要在合法的狀況下,它們會盡可能多去匹配字符,這就叫作貪心模式

若是咱們但願正則儘可能少地匹配字符,那麼就能夠在表示數字的符號後面加上一個?。組成以下的形式:

{n,}?, *?, +?, ??, {m,n}?

一樣來看一個例子:

reg = /c{1,}?/;
str = 'ccccc';
execReg(reg, str);

返回的結果只有1個c,儘管有5個c能夠匹配,可是因爲正則表達式是非貪心模式,因此只會匹配一個。

/^開頭,結尾$/

^表示只匹配字符串的開頭。看下面的例子:

reg = /^c/;
str = '維生素c';
execReg(reg, str);

結果爲null,由於字符串‘維生素c’的開頭並非c,因此匹配失敗。

reg = /^c/;
str = 'cainiao';
execReg(reg, str);

此次則返回c,匹配成功,由於cainiao偏偏是以c開頭的。

與^相反,$則只匹配字符串結尾的字符,一樣,看例子:

reg = /c$/;
str = 'cainiao';
execReg(reg, str);

返回null,表示正則表達式沒能在字符串的結尾找到c這個字符。

reg = /c$/;
str = '維生素c';
execReg(reg, str);

此次返回的結果是c,代表匹配成功。

 點’.’

‘.’會匹配字符串中除了換行符\n以外的全部字符,例如

reg = /./;
str = 'cainiao';
execReg(reg, str);

結果顯示,正則匹配到了字符c。

reg = /./;
str = 'blueidea';
execReg(reg, str);

此次是b。

reg = /.+/;
str = 'blueidea——經典論壇  好_。';
execReg(reg, str);

結果是「blueidea——經典論壇 好_。「也就是說全部的字符都被匹配掉了,包括一個空格,一個下滑線,和一個破折號。

reg = /.+/;
reg = /.+/;
str = 'bbs.blueidea.com';
execReg(reg, str);

一樣,直接返回整個字符串——bbs.blueidea.com,可見」.」也匹配」.」自己。

reg = /^./;
str = '\ncainiao';
execReg(reg, str);

結果是null,終於失敗了,正則要求字符串的第一個字符不是換行,可是偏偏字符是以\n開始的。

二選一,正則表達式中的或,「|「

b|c表示,匹配b或者c。

例如:

reg = /b|c/;
str = 'blueidea';
execReg(reg, str);

結果是b。

reg = /b|c/;
str = 'cainiao';
execReg(reg, str);

結果是c。

reg = /^b|c.+/;
str = 'cainiao';
execReg(reg, str);

匹配掉整個cainiao。

reg = /^b|c.+/;
str = 'bbs.blueidea.com';
execReg(reg, str);

結果只有一個b,而不是整個字符串。由於上面正則表達式的意思是,匹配開頭的b或者是c.+。

括號

reg = /^(b|c).+/;

str = 'bbs.blueidea.com';
execReg(reg, str);

此次的結果是整個串bbs.blueidea.com,機上上面的括號這後,這個正則的意思是,若是字符串的開頭是b或者c,那麼匹配開頭的b或者c以及其後的全部的非換行字符。

若是你也實驗了的話,會發現返回的結果後面多出來一個「,b「,這是()內的b|c所匹配的內容。咱們在正則表達式內括號裏寫的內容會被認爲是子正則表達式,所匹配的結果也會被記錄下來供後面使用。咱們暫且不去理會這個特性。

字符集合[abc]

[abc]表示a或者b或者c中的任意一個字符。例如:

reg = /^[abc]/;
str='bbs.blueidea.com';
execReg(reg,str);

返回結果是b。

reg = /^[abc]/;
str='test';
execReg(reg,str);

此次的結果就是null了。

咱們在字字符集合中使用以下的表示方式:[a-z],[A-Z],[0-9],分別表示小寫字母,大寫字母,數字。例如:

reg =  /^[a-zA-Z][a-zA-Z0-9_]+/;
str='test';
execReg(reg,str);

結果是整個test,正則的意思是開頭必須是英文字母,後面能夠是英文字母或者數字以及下劃線。

反字符集合[^abc]

^在正則表達式開始部分的時候表示開頭的意思,例如/^c/表示開頭是c;可是在字符集和中,它表示的是相似「非「的意思,例如[^abc]就表示不能是a,b或者c中的任何一個。例如:

reg = /[^abc]/;
str='blueidea';
execReg(reg,str);

返回的結果是l,由於它是第一個非abc的字符(即第一個b沒有匹配)。一樣:

reg = /[^abc]/;
str='cainiao';
execReg(reg,str);

則返回i,前兩個字符都是[abc]集合中的。

由此咱們可知:[^0-9]表示非數字,[^a-z]表示非小寫字母,一次類推。

邊界與非邊界

\b表示的邊界的意思,也就是說,只有字符串的開頭和結尾纔算數。例如/\bc/就表示字符串開始的c或者是結尾的c。看下面的例子:

reg = /\bc/;
str='cainiao';
execReg(reg,str);

返回結果c。匹配到了左邊界的c字符。

reg = /\bc/;
str='維生素c';
execReg(reg,str);

仍然返回c,不過此次返回的是右側邊界的c。

reg = /\bc/;
str='bcb';
execReg(reg,str);

此次匹配失敗,由於bcb字符串中的c被夾在中間,既不在左邊界也再也不右邊界。

與\b對應\B表示非邊界。例如:

reg = /\Bc/;
str='bcb';
execReg(reg,str);

此次會成功地匹配到bcb中的c,。然而

reg = /\Bc/;
str='cainiao';
execReg(reg,str);

則會返回null。由於\B告訴正則,只匹配非邊界的c。

數字與非數字

\d表示數字的意思,相反,\D表示非數字。例如:

reg = /\d/;
str='cainiao8';
execReg(reg,str);

返回的匹配結果爲8,由於它是第一個數字字符。

reg = /\D/;
str='cainiao8';
execReg(reg,str);

返回c,第一個非數字字符。

空白

\f匹配換頁符,\n匹配換行符,\r匹配回車,\t匹配製表符,\v匹配垂直製表符。

\s匹配單個空格,等同於[\f\n\r\t\v]。例如:

reg = /\s.+/;
str='This is a test  String.';
execReg(reg,str);

返回「is a test String.」,正則的意思是匹配第一個空格以及其後的全部非換行字符。

一樣,\S表示非空格字符。

reg = /\S+/;
str='This is a test  String.';
execReg(reg,str);

匹配結果爲This,當遇到第一個空格以後,正則就中止匹配了。

單詞字符

\w表示單詞字符,等同於字符集合[a-zA-Z0-9_]。例如:

reg = /\w+/;
str='blueidea';
execReg(reg,str);

返回完整的blueidea字符串,由於全部字符都是單詞字符。

reg = /\w+/;
str='.className';
execReg(reg,str);

結果顯示匹配了字符串中的className,只有第一個「.」——惟一的非單詞字符沒有匹配。

reg = /\w+/;
str='中文如何?';
execReg(reg,str);

試圖用單詞字符去匹配中文天然行不通了,返回null。

\W表示非單詞字符,等效於[^a-zA-Z0-9_]

reg = /\W+/;
str='中文如何?';
execReg(reg,str);

返回完整的字符串,由於,不管是中文和「?」都算做是非單詞字符。

反向引用

形式以下:/(子正則表達式)\1/

依舊用例子來講明:

1.

reg = /\w/;
str='blueidea';
execReg(reg,str);

返回b。

2.

reg = /(\w)(\w)/;
str='blueidea';
execReg(reg,str);

返回bl,b,l

bl是整個正則匹配的內容,b是第一個括號裏的子正則表達式匹配的內容,l是第二個括號匹配的內容。

3.

reg = /(\w)\1/;
str='blueidea';
execReg(reg,str);

則會返回null。這裏的「\1」就叫作反向引用,它表示的是第一個括號內的字正則表達式匹配的內容。在上面的例子中,第一個括號裏的(\w)匹配了b,所以「\1」就一樣表示b了,在餘下的字符串裏天然找不到b了。

與第二個例子對比就能夠發現,「\1」是等同於「第1個括號匹配的內容」,而不是「第一個括號的內容」。

reg = /(\w)\1/;
str='bbs.blueidea.com';
execReg(reg,str);

這個正則則會匹配到bb。

一樣,前面有幾個子正則表達式咱們就可使用幾個反向引用。例如:

reg = /(\w)(\w)\2\1/;
str='woow';
execReg(reg,str);

會匹配成功,由於第一個括號匹配到w,第二個括號匹配到o,而\2\1則表示ow,剛好匹配了字符串的最後兩個字符。

括號(2)

前面咱們曾經討論過一次括號的問題,見下面這個例子:

reg = /^(b|c).+/;
str='bbs.blueidea.com';
execReg(reg,str);

這個正則是爲了實現只匹配以b或者c開頭的字符串,一直匹配到換行字符,可是。上面咱們已經看到了,可使用「\1」來反向引用這個括號裏的子正則表達式所匹配的內容。並且exec方法也會將這個字正則表達式的匹配結果保存到返回的結果中。

不記錄子正則表達式的匹配結果

使用形如(?:pattern)的正則就能夠避免保存括號內的匹配結果。例如:

reg = /^(?:b|c).+/;
str='bbs.blueidea.com';
execReg(reg,str);

能夠看到返回的結果再也不包括那個括號內的字正則表達式多匹配的內容。

同理,反向引用也很差使了:

reg = /^(b|c)\1/;
str='bbs.blueidea.com';
execReg(reg,str);

返回bb,b。bb是整個正則表達式匹配的內容,而b是第一個子正則表達式匹配的內容。

reg = /^(?:b|c)\1/;
str='bbs.blueidea.com';
execReg(reg,str);

返回null。因爲根本就沒有記錄括號內匹配的內容,天然沒有辦法反向引用了。

正向預查

形式:(?=pattern)

所謂正向預查,意思就是:要匹配的字符串,後面必須緊跟着pattern!

咱們知道正則表達式/cainiao/會匹配cainiao。一樣,也會匹配cainiao9中的cainiao。可是咱們可能但願,cainiao只能匹配cainiao8中的菜鳥。這時候就能夠像下面這樣寫:/cainiao(?=8)/,看兩個實例:

reg = /cainiao(?=8)/;
str='cainiao9';
execReg(reg,str);

返回null。

reg = /cainiao(?=8)/;
str='cainiao8';
execReg(reg,str);

匹配cainiao。

須要注意的是,括號裏的內容並不參與真正的匹配,只是檢查一下後面的字符是否符合要求而已,例如上面的正則,返回的是cainiao,而不是cainiao8。

再來看兩個例子:

reg = /blue(?=idea)/;
str='blueidea';
execReg(reg,str);

匹配到blue,而不是blueidea。

reg = /blue(?=idea)/;
str='bluetooth';
execReg(reg,str);

返回null,由於blue後面不是idea。

reg = /blue(?=idea)/;
str='bluetoothidea';
execReg(reg,str);

一樣返回null。

?!

形式(?!pattern)和?=剛好相反,要求字符串的後面不能緊跟着某個pattern,還拿上面的例子:

reg = /blue(?!idea)/;
str='blueidea';
execReg(reg,str);

返回null,由於正則要求,blue的後面不能是idea。

reg = /blue(?!idea)/;
str='bluetooth';
execReg(reg,str);

則成功返回blue。

匹配元字符

首先要搞清楚什麼是元字符呢?咱們以前用過*,+,?之類的符號,它們在正則表達式中都有必定的特殊含義,相似這些有特殊功能的字符都叫作元字符。例如

reg = /c*/;

表示有任意個c,可是若是咱們真的想匹配’c*’這個字符串的時候怎麼辦呢?只要將*轉義了就能夠了,以下:

reg = /c\*/;
str='c*';
execReg(reg,str);

返回匹配的字符串:c*。

同理,要匹配其餘元字符,只要在前面加上一個「\」就能夠了。

正則表達式的修飾符

全局匹配,修飾符g

形式:/pattern/g

例子:reg = /b/g;

後面再說這個g的做用。先看後面的兩個修飾符。

不區分大小寫,修飾符i

形式:/pattern/i

例子:

var reg = /b/;
var str = 'BBS';
execReg(reg,str);

返回null,由於大小寫不符合。

var reg = /b/i;
var str = 'BBS';
execReg(reg,str);

匹配到B,這個就是i修飾符的做用了。

行首行尾,修飾符m

形式:/pattern/m

m修飾符的做用是修改^和$在正則表達式中的做用,讓它們分別表示行首和行尾。例如:

var reg = /^b/;
var str = 'test\nbbs';
execReg(reg,str);

匹配失敗,由於字符串的開頭沒有b字符。可是加上m修飾符以後:

var reg = /^b/m;
var str = 'test\nbbs';
execReg(reg,str);

匹配到b,由於加了m修飾符以後,^已經表示行首,因爲bbs在字符串第二行的行首,因此能夠成功地匹配。

 

 

延伸閱讀:

JavaScript正則表達式詳解(二)JavaScript中正則表達式函數詳解

相關文章
相關標籤/搜索