JSRegex

來源:互聯網
上載者:User

標籤:綜合   用例   message   大寫   mil   nload   class   scrolling   bsp   

g是模式修正符,表示在整個字串裡多次尋找

 

match方法來找到和reg正則相匹配的內容

 

"ab23839cd".match(/\d+/)

 

空白\s(包括空格斷行符號定位字元等)

\f匹配換頁符,\n匹配分行符號,\r匹配斷行符號,\t匹配製表符,\v匹配垂直定位字元。

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

例1:

 

var reg = /\s.+/;

var str=‘This is a test String.‘;

alert(reg.exec(str));

返回“is a test String.”,正則的意思是匹配第一個空格以及其後的所有非換行字元。

 

同樣,\S表示非空白字元。

例2:

 

var reg = /\S+/;

var str=‘This is a test String.‘;

alert(reg.exec(str));

匹配結果為This,當遇到第一個空格之後,正則就停止匹配了。

 

在正則中最常用到的一個是:

例3:var reg=/^\s*$/; //匹配任意空或空白字元,如果你什麼也沒輸入,或輸入的只有空格、斷行符號、換行等字元,則匹配成功。這樣就可以驗證使用者是否正確輸入內容了。

這個用來驗證輸入框裡是否寫了有效效字元,用法如下:

 

var  reg=/^\s*$/;

if(reg.test(value)){

  alert(‘請輸入有效值‘);

  return false;

}

 

單字元\w

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

 

var reg = /\w+/;

var str=‘zhufengpeixun‘;

alert(reg.exec(str));

返回完整的zhufengpeixun字串,因為所有字元都是單詞字元。

 

var reg = /\w+/;

var str=‘.className‘;

alert(reg.exec(str));

結果顯示匹配了字串中的className,只有第一個“.”唯一的非單詞字元沒有匹配。

 

var reg = /\w+/;

var str=‘正則教程‘;

alert(reg.exec(str));

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

 

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

 

var reg = /\W+/;

var str=‘正則教程‘;

alert(reg.exec(str));

返回完整的字串,因為,中文算作是非單詞字元。

 

分組和分組的引用

請見線上視頻的正則專題部分的

Regex基礎第三講:分組、分組的引用、選擇等http://online.zhufengpeixun.cn/viewCourseDetail.do?courseId=141415

 

形式如下:/(子Regex)\1/ 依舊用例子來說明:

 

1.例子

var reg = /\w/;

var str=‘zhufengpeixun‘;

alert(reg.exec(str));

//返回z。

 

2.例子

var reg = /(\w)(\w)/;

var str=‘zhufengpeixun‘;

alert(reg.exec(str));

返回zh,z,h ,zh是整個正則匹配的內容,z是第一個括弧裡的子Regex匹配的內容,h是第二個括弧匹配的內容。

 

3.例子

var reg = /(\w)\1/;

var str=‘zhufengpeixun‘;

alert(reg.exec(str));

則會返回null。這裡的“\1”就叫做反向引用,它表示的是第一個括弧內的子Regex匹配的內容。在上面的例子中,第一個括弧裡的(\w)匹配了z,因此“\1”就同樣表示z了,在餘下的字串裡自然找不到z了。與第二個例子對比就可以發現,“\1”是等同於“第1個括弧匹配的內容”,而不是“第一個括弧的內容”。

 

var reg = /(\w)\1/;

var str=‘bbs.zhufengpeixun.cn‘;

alert(reg.exec(str));

這個正則則會匹配到bb,b。同樣,前面有幾個子Regex我們就可以使用幾個反向引用。例如:

 

var reg = /(\w)(\w)\2\1/;

var str=‘woow‘;

alert(reg.exec(str));

會匹配成功,因為第一個括弧匹配到w,第二個括弧匹配到o,而\2\1則表示ow,恰好匹配了字串的最後兩個字元。

 

括弧() ,表示子運算式,也叫分組

 

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

 

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

var str=‘bbs.blueidea.com‘;

alert(reg.exec(str));

這個正則是為了實現只匹配以b或者c開頭的字串,一直匹配到換行字元,但是。上面我們已經看到了,可以使用“\1”來反向引用這個括弧裡的子Regex所匹配的內容。而且exec方法也會將這個字Regex的匹配結果儲存到返回的結果中。

 

不記錄子Regex的匹配結果[匹配不捕獲]

使用形如(?:pattern)的正則就可以避免儲存括弧內的匹配結果。例如:

 

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

var str=‘bbs.blueidea.com‘;

alert(reg.exec(str));

可以看到返回的結果不再包括那個括弧內的字Regex多匹配的內容。同理,反向引用也不好使了:

 

var reg = /^(b|c)\1/;

var str=‘bbs.zhufengpeixun.cn‘;

alert(reg.exec(str));

返回bb,b。bb是整個Regex匹配的內容,而b是第一個子Regex匹配的內容。

 

var reg = /^(?:b|c)\1/;

var str=‘bbs.zhufengpeixun.cn‘;

alert(reg.exec(str));

返回null。由於根本就沒有記錄括弧內匹配的內容,自然沒有辦法反向引用了。

 

正向預查

形式:(?=pattern)所謂正向預查,意思就是:要匹配的字串,後面必須緊跟著pattern! 我們知道Regex/cainiao/會匹配cainiao。同樣,也會匹配cainiao9中的cainiao。但是我們可能希望,cainiao只能匹配cainiao8中的cainiao。這時候就可以像下面這樣寫:/cainiao(?=8)/,看兩個執行個體:

 

var reg = /cainiao(?=8)/;

var  str=‘cainiao9‘;

alert(reg.exec(str));

//返回null。

var reg = /cainiao(?=8)/;

var  str=‘cainiao8‘;

alert(reg.exec(str));

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

 

再來看幾個例子:

 

var reg = /zhufeng(?=peixun)/;

var  str=‘zhufengpeixun‘;

alert(reg.exec(str));

匹配到zhufeng,而不是peixun。

 

var reg = /zhufeng(?=peixun)/;

var str=’zhufengonline’;

alert(reg.exec(str));

返回null,因為zhufeng後面不是peixun。

 

var reg = /zhufeng(?=peixun)/;

var str=‘onlinepeixun‘;

alert(reg.exec(str));

同樣返回null。

 

?!

 

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

 

var reg = /zhufeng(?!js)/;

var str=`zhufengjs`;

alert(reg.exec(str));

返回null,因為正則要求,zhufeng的後面不能是js。

 

var reg = /zhufeng(?!js)/;

var  str=‘zhufengpeixun‘;

alert(reg.exec(str));

則成功返回zhufeng。

 

匹配元字元

首先要搞清楚什麼是元字元呢?我們之前用過*,+,?之類的符號,它們在Regex中都有一定的特殊含義,類似這些有特殊功能的字元都叫做元字元。例如

 

var reg = /c*/;

表示有任意個c,但是如果我們真的想匹配c*這個字串的時候怎麼辦呢?只要將*轉義了就可以了,如下:

 

var reg = /c\*/;

var str=‘c*‘;

alert(reg.exec(str));

返回匹配的字串:c*。

 

同理,要匹配其他元字元,只要在前面加上一個“\”就可以了。

 

Regex的修飾符

全域匹配,修飾符g

 

形式:/pattern/g 例子:reg = /b/g; 後面再說這個g的作用。先看後面的兩個修飾符。不區分大小寫,修飾符i

 

形式:/pattern/i 例子:

 

var reg = /b/;

var str = ‘BBS‘;

alert(reg.exec(str));

返回null,因為大小寫不符合。

 

var reg = /b/i;

var str = ‘BBS‘;

alert(reg.exec(str));

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

 

行首行尾,修飾符m

 

形式:/pattern/m m修飾符的作用是修改^和$在Regex中的作用,讓它們分別表示行首和行尾。例如:

 

var reg = /^b/;

var str = ‘test\nbbs‘;

alert(reg.exec(str));

匹配失敗,因為字串的開頭沒有b字元。但是加上m修飾符之後:

 

var reg = /^b/m;

var str = ‘test\nbbs‘;

alert(reg.exec(str));;

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

 

匹配固定的n個 c{n}

{1}表示一個的意思。/c{1}/只能匹配一個c,和/c/是一個意思,一般匹配只出現一次的字元,後邊的{1}就不寫了。/c{2}/則會匹配兩個連續的c。以此類推, /c{n}/則會匹配n個連續的c。看下面的例子:

 

var reg = /c{1}/;  

var str=‘china_zhufengpeixun‘;

alert(reg.exec(str));

//輸出結果是:c

 

var reg = /o{2}/;  

var str=‘money‘;  

alert(reg.exec(str));

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

 

reg = /o{2}/;

str=‘good food‘;

alert(reg.exec(str))

//輸出結果oo。(其實是第一組oo,不會匹配到第二組oo,因為正則的匹配是懶惰的,不加模式比對符g,則表示只去匹配一次,匹配到了則返回並且停止。

如果寫成

 

reg=/o{2}/g;

alert(str.match(reg))

//則輸出oo,oo了

 

c{m,n} 匹配最少m個,最多n個

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

 

reg = /o{3,4}/;// (匹配三到四個o)

str=‘good正則教程‘;

alert(reg.exec(str));

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

 

reg = /o{3,4}/;

str=‘goood正則教程‘;

alert(reg.exec(str));

彈出結果是:ooo。例:

 

reg = /o{3,4}/;

str=‘very gooood正則教程‘;

alert(reg.exec(str));

輸出的結果是:oooo,這表明正則會盡量多匹配,可3可4的時候它會選擇多匹配一個。(這就是貪婪匹配)例:

 

reg = /c{3,4}/;

str=‘cccccTest‘;

alert(reg.exec(str));

仍然會匹配4個c。

 

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

 

c{n,}表示最少匹配n個c,最多不限制

c{1,}表示1個以上的c,相當於+。如下:

 

例:

 

reg = /c{1,}/;str=‘cainiao‘;

alert(reg.exec(str));

//結果彈出c。

例:

 

reg = /c{1,}/;

str=‘cccccTest‘;

alert(reg.exec(str));

//返回ccccc,再次說明了Regex會盡量多地匹配。

例:

 

reg = /c{2,}/;

str=‘cainiao‘;

alert(reg.exec(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‘;

 alert(reg.exec(str));

返回的結果只有1個c,儘管有5個c可以匹配,但是由於Regex是非貪心模式,所以只會匹配一個。

 

/^開頭,結尾$/ 【表示位置】

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

 

例1:

 

reg = /^c/;

str=‘維生素c‘;

alert(reg.exec(str));

結果為null,因為字串‘維生素c’的開頭並不是c,所以匹配失敗。

 

例2:

 

reg = /^z/;

str=‘zhufengpeixun‘;

alert(reg.exec(str));;

這次則返回c,匹配成功,因為cainiao恰恰是以z開頭的。

 

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

 

例3:

 

reg = /z$/;

str=‘zhufengpeixun‘;

alert(reg.exec(str));

輸出null,表示Regex沒能在字串的結尾找到z這個字元。

 

例4:

 

reg = /d$/;

str=‘正則教程good‘;

alert(reg.exec(str));

這次返回的結果是d,表明匹配成功。

 

元字元點’.’的用法

.會匹配字串中除了分行符號\n之外的所有字元,例如

 

reg = /./; //一個點表示匹配字串中出現的第一個非分行符號字元。

str=‘zhufengpeixun‘;

alert(reg.exec(str));;

結果顯示,正則匹配到了字元z。

 

reg = /./;

str=‘online.zhufengpeixun‘;

alert(reg.exec(str));

這次是o,只要有一個是非換行字元,就表示匹配成功,就不會往下再繼續了。

 

reg = /.+/;

str=‘zhufengpeixun_  前端開發權威培訓‘;

alert(reg.exec(str));

結果是“zhufengpeixun_前端開發“也就是說所有的字元都被匹配掉了,包括一個空格,一個下滑線

 

【貪婪匹配】。

 

例1:

 

reg = /.+/;

str=‘online.zhufengpeixun.cn‘;  

alert(reg.exec(str));;

同樣,直接返回整個字串——online.zhufengpeixun.cn,可見”.”也匹配”.”本身。

 

例2:

 

reg = /^./; //這樣表示必須以非分行符號開始。

str=‘\nzhufengpeixun‘;

alert(reg.exec(str));

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

 

“|“,Regex中的或,把“|”左右兩邊的一到多個字元當成一個整體對待

b|c表示,匹配b或者c(這裡相當於[bc])。ab|ac表示匹配ab或ac(但這裡不相當於[abc],[]表示在一組字元中任選一個)。

 

例1:

 

/z|o/.exec(‘zhufengpeixun‘))

//結果是z。

例2:

 

/z|o/.exec(‘online‘);

//結果是o。

例3:

 

/^z|o.+/.exec(‘online‘);

//匹配掉整個online。

例4:

 

/^z|o.+/.exec(‘zhufengpeixun.cn‘);

//結果只有一個z,而不是整個字串。因為上面Regex的意思是,匹配開頭的z或者是o.+。

 

和括弧結合使用

例:

 

/^(z|o).+/.exec(‘zhufengpeixun‘);

這次的結果是整個串zhufengpeixun,加上上面的括弧這後,這個正則的意思是,如果字串的開頭是z或者o,那麼匹配開頭的z或者o以及其後的所有的非換行字元。如果你也實驗了的話,會發現返回的結果後面多出來一個“z“,這是()內的z|o所匹配的內容(這個叫分組或子正則)。我們在Regex內括弧裡寫的內容會被認為是子Regex,所匹配的結果也會被記錄下來供後面使用。我們暫且不去理會這個特性。

 

方括弧的作用:[]

 

[abc]表示a或者b或者c中的任意一個字元。

 

例:

 

var reg = /^[abc]/;

//這個有點像/^(a|b|c)/

str=‘bbs.zhufengpeixun.cn‘;

alert(reg.exec(str));;

//返回結果是b。

例:

 

reg = /^[abc]/;

str=‘test‘;

alert(reg.exec(str));

//這次的結果就是null了。

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

 

reg = /^[a-zA-Z][a-zA-Z0-9_]+/;  

//後面這個其實這個就是元字元\w表示的含意

str=‘test‘;

alert(reg.exec(str));

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

 

關於正則中的連續字元

 

在正則中/[0-9]/表示匹配字元從0到9中的任意一個,/[a-z]/表示匹配從a到z中的任意一個字母只要是在ASCII碼錶裡連續出現的字元,都可以用這樣的標記法。

 

請百度一下“ASCII碼錶”,參照裡面字元出現的順序和對應的16進位或10進位的編碼。

 

比如var reg=/^[!-z]$/; 就會匹配從字元“!”開始,到字元“z”結束的任意一個字元。

 

var reg=/^[!-z]$/;

alert(reg.test("8"));//true,

alert(reg.test("*"))//true,

alert(reg.test("}"))//false,因為"}"不在從!到z的這個範圍內

正則/^[!-z]$/也可以用16進位來表示。如果用16進位表示,則需要用\u開頭,表示這是在以16進位的方式定義unicode字元,並且後邊的16進位的編碼要寫成四位,不足4位的前邊補0。則上邊的那個正則,也可以寫成

 

var reg=/^[\u0021-\u007a]$/;

// 字元“!”對應的16進位編碼是21,字元“z”的16進位編碼是7a。

這種方式。中文是擴充的ASCII字元編碼,匹配UTF8中文的正則是:/^[\u4e00-\u9fa5]+$/

 

php中utf-8編碼下用Regex匹配漢字的正則是:/^[\x{4e00}-\x{9fa5}]+$/u

 

注意:寫成[1-13]不是表示從數字1到數字13,而是表示從1到1和3,也就是1和3。因為正則裡是在表示連續出現的字元,而不是數字。

 

反字元集合[^abc]

 

^在Regex開始部分的時候表示開頭的意思,例如/^c/表示開頭是c;但是在字元集和中,它表示的是類似“非“的意思,例如[^abc]就表示不能是a,b或者c中的任何一個。例如:

 

var reg = /[^abc]/;

var str=‘blueidea‘;

alert(reg.exec(str));

返回的結果是l,因為它是第一個非abc的字元(即第一個b沒有匹配)。同樣:

 

例:

 

var reg = /[^abc]/;

var str=‘cbazhufengpeixun‘;

alert(reg.exec(str));

輸出z,前三個字元都是[abc]集合中的。由此我們可知:[^0-9]表示非數字,[^a-z]表示非小寫字母,依次類推。

 

邊界與非邊界

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

 

/\bc/.exec(‘cainiao‘);

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

/\bc/.exec(‘???c‘);

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

/\bc/.exec(‘bcb‘);

//這次匹配失敗,因為bcb字串中的c被夾在中間,既不在左邊界也不再右邊界。

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

 

/\Bc/.exec(‘bcb‘);

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

/\Bc/.exec(‘cainiao‘);

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

 

數字與非數字

\d表示數位意思,相反,\D表示非數字。

 

例:

 

/\d/.exec(‘cainiao8‘)

//返回的匹配結果為8,因為它是第一個數字字元。

例:

 

/\D/.exec(‘cainiao8‘);

//返回c,第一個非數字字元。

 

轉自: 1190000002471140

 sutaking

 

JSRegex

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.