JS正則表達式元字符


正則 描述 正則 描述
\f 匹配換頁符 \t 匹配製表符
\n 匹配換行符 \v 匹配垂直製表符
\r 匹配回車 \s 匹配單個空格,等同於[\f\n\r\t\v];
\S 表示非空格字符 \d 在正則中表示數字
\w 表示單詞字符,等同於字符集合[a-zA-Z0-9_] \ 建立正則對象時,要轉義
+ 表示出現一到屢次 ^ 表示後邊出現的數字必須在開頭
$ 表示前面出現的數字必須出如今結尾

視頻教程php

g是模式修正符,表示在整個字符串裏屢次查找前端

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

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

空白\s(包括空格回車製表符等)

\f匹配換頁符,\n匹配換行符,\r匹配回車,\t匹配製表符,\v匹配垂直製表符。
\s匹配單個空格,等同於[\f\n\r\t\v]。例如:
例1:ide

jsvar reg = /\s.+/;
var str='This is a test String.';
alert(reg.exec(str));

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

一樣,\S表示非空格字符。
例2:idea

jsvar reg = /\S+/;
var str='This is a test String.';
alert(reg.exec(str));

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

在正則中最經常使用到的一個是:
例3:var reg=/^\s*$/; //匹配任意空或空白字符,若是你什麼也沒輸入,或輸入的只有空格、回車、換行等字符,則匹配成功。這樣就能夠驗證用戶是否正確輸入內容了。
這個用來驗證輸入框裏是否寫了有效效字符,用法以下:視頻

jsvar  reg=/^\s*$/;
if(reg.test(value)){
  alert('請輸入有效值');
  return false;
}

單字符\w

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

jsvar reg = /\w+/;
var str='zhufengpeixun';
alert(reg.exec(str));

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

jsvar reg = /\w+/;
var str='.className';
alert(reg.exec(str));

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

jsvar reg = /\w+/;
var str='正則教程';
alert(reg.exec(str));

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

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

jsvar reg = /\W+/;
var str='正則教程';
alert(reg.exec(str));

返回完整的字符串,由於,中文算做是非單詞字符。


分組和分組的引用

請見在線視頻的正則專題部分的
正則表達式基礎第三講:分組、分組的引用、選擇等http://online.zhufengpeixun.cn/viewCourseDetail.do?courseId=141415

形式以下:/(子正則表達式)\1/ 依舊用例子來講明:

1.例子

jsvar reg = /\w/;
var str='zhufengpeixun';
alert(reg.exec(str));
//返回z。

2.例子

jsvar reg = /(\w)(\w)/;
var str='zhufengpeixun';
alert(reg.exec(str));

返回zh,z,h ,zh是整個正則匹配的內容,z是第一個括號裏的子正則表達式匹配的內容,h是第二個括號匹配的內容。

3.例子

jsvar reg = /(\w)\1/;
var str='zhufengpeixun';
alert(reg.exec(str));

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

jsvar reg = /(\w)\1/;
var str='bbs.zhufengpeixun.cn';
alert(reg.exec(str));

這個正則則會匹配到bb,b。一樣,前面有幾個子正則表達式咱們就可使用幾個反向引用。例如:

jsvar reg = /(\w)(\w)\2\1/;
var str='woow';
alert(reg.exec(str));

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

括號() ,表示子表達式,也叫分組

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

jsvar reg = /^(b|c).+/;
var str='bbs.blueidea.com';
alert(reg.exec(str));

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


不記錄子正則表達式的匹配結果[匹配不捕獲]

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

jsvar reg = /^(?:b|c).+/;
var str='bbs.blueidea.com';
alert(reg.exec(str));

能夠看到返回的結果再也不包括那個括號內的字正則表達式多匹配的內容。同理,反向引用也很差使了:

jsvar reg = /^(b|c)\1/;
var str='bbs.zhufengpeixun.cn';
alert(reg.exec(str));

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

jsvar reg = /^(?:b|c)\1/;
var str='bbs.zhufengpeixun.cn';
alert(reg.exec(str));

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


正向預查

形式:(?=pattern)所謂正向預查,意思就是:要匹配的字符串,後面必須緊跟着pattern! 咱們知道正則表達式/cainiao/會匹配cainiao。一樣,也會匹配cainiao9中的cainiao。可是咱們可能但願,cainiao只能匹配cainiao8中的cainiao。這時候就能夠像下面這樣寫:/cainiao(?=8)/,看兩個實例:

jsvar reg = /cainiao(?=8)/;
var  str='cainiao9';
alert(reg.exec(str));
//返回null。
jsvar reg = /cainiao(?=8)/;
var  str='cainiao8';
alert(reg.exec(str));

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

再來看幾個例子:

jsvar reg = /zhufeng(?=peixun)/;
var  str='zhufengpeixun';
alert(reg.exec(str));

匹配到zhufeng,而不是peixun

jsvar reg = /zhufeng(?=peixun)/;
var str=’zhufengonline’;
alert(reg.exec(str));

返回null,由於zhufeng後面不是peixun

jsvar reg = /zhufeng(?=peixun)/;
var str='onlinepeixun';
alert(reg.exec(str));

一樣返回null

?!

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

jsvar reg = /zhufeng(?!js)/;
var str=`zhufengjs`;
alert(reg.exec(str));

返回null,由於正則要求,zhufeng的後面不能是js

jsvar reg = /zhufeng(?!js)/;
var  str='zhufengpeixun';
alert(reg.exec(str));

則成功返回zhufeng


匹配元字符

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

jsvar reg = /c*/;

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

jsvar reg = /c\*/;
var str='c*';
alert(reg.exec(str));

返回匹配的字符串:c*

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


正則表達式的修飾符

全局匹配,修飾符g

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

形式:/pattern/i 例子:

jsvar reg = /b/;
var str = 'BBS';
alert(reg.exec(str));

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

jsvar reg = /b/i;
var str = 'BBS';
alert(reg.exec(str));

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

行首行尾,修飾符m

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

jsvar reg = /^b/;
var str = 'test\nbbs';
alert(reg.exec(str));

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

jsvar 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。看下面的例子:

jsvar 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,則表示只去匹配一次,匹配到了則返回而且中止。

若是寫成

jsreg=/o{2}/g;
alert(str.match(reg))
//則輸出oo,oo了

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

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

jsreg = /o{3,4}/;// (匹配三到四個o)
str='good正則教程';
alert(reg.exec(str));

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

jsreg = /o{3,4}/;
str='goood正則教程';
alert(reg.exec(str));

彈出結果是:ooo。例:

jsreg = /o{3,4}/;
str='very gooood正則教程';
alert(reg.exec(str));

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

jsreg = /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,至關於+。以下:

例:

jsreg = /c{1,}/;str='cainiao';
alert(reg.exec(str));
//結果彈出c。

例:

jsreg = /c{1,}/;
str='cccccTest';
alert(reg.exec(str));
//返回ccccc,再次說明了正則表達式會盡可能多地匹配。

例:

jsreg = /c{2,}/;
str='cainiao';
alert(reg.exec(str));

結果返回nullc{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';的例子中已經看到了,能匹配四個的時候,正則絕對不會去匹配三個。上面所介紹的全部的正則都是這樣,只要在合法的狀況下,它們會盡可能多去匹配字符,這就叫作貪心模式。若是咱們但願正則儘可能少地匹配字符,那麼就能夠在表示數字的符號後面加上一個?(即:問號加在量詞的後邊,則表示非貪婪匹配)。組成以下的形式:

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

例:

jsreg = /c{1,}?/;
str='ccccc';
 alert(reg.exec(str));

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

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

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

例1:

jsreg = /^c/;
str='維生素c';
alert(reg.exec(str));

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

例2:

jsreg = /^z/;
str='zhufengpeixun';
alert(reg.exec(str));;

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

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

例3:

jsreg = /z$/;
str='zhufengpeixun';
alert(reg.exec(str));

輸出null,表示正則表達式沒能在字符串的結尾找到z這個字符。

例4:

jsreg = /d$/;
str='正則教程good';
alert(reg.exec(str));

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


元字符點’.’的用法

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

jsreg = /./; //一個點表示匹配字符串中出現的第一個非換行符字符。
str='zhufengpeixun';
alert(reg.exec(str));;

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

jsreg = /./;
str='online.zhufengpeixun';
alert(reg.exec(str));

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

jsreg = /.+/;
str='zhufengpeixun_  前端開發權威培訓';
alert(reg.exec(str));

結果是「zhufengpeixun_前端開發「也就是說全部的字符都被匹配掉了,包括一個空格,一個下滑線

【貪婪匹配】。

例1:
jsreg = /.+/;
str='online.zhufengpeixun.cn';  
alert(reg.exec(str));;

一樣,直接返回整個字符串——online.zhufengpeixun.cn,可見」.」也匹配」.」自己。

例2:
jsreg = /^./; //這樣表示必須以非換行符開始。
str='\nzhufengpeixun';
alert(reg.exec(str));

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


「|「,正則表達式中的或,把「|」左右兩邊的一到多個字符當成一個總體對待

b|c表示,匹配b或者c(這裏至關於[bc])。ab|ac表示匹配abac(但這裏不至關於[abc][]表示在一組字符中任選一個)。

例1:
js/z|o/.exec('zhufengpeixun'))
//結果是z。
例2:
js/z|o/.exec('online');
//結果是o。
例3:
js/^z|o.+/.exec('online');
//匹配掉整個online。
例4:
js/^z|o.+/.exec('zhufengpeixun.cn');
//結果只有一個z,而不是整個字符串。由於上面正則表達式的意思是,匹配開頭的z或者是o.+。

和括號結合使用

例:

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

此次的結果是整個串zhufengpeixun,加上上面的括號這後,這個正則的意思是,若是字符串的開頭是z或者o,那麼匹配開頭的z或者o以及其後的全部的非換行字符。若是你也實驗了的話,會發現返回的結果後面多出來一個「z「,這是()內的z|o所匹配的內容(這個叫分組或子正則)。咱們在正則表達式內括號裏寫的內容會被認爲是子正則表達式,所匹配的結果也會被記錄下來供後面使用。咱們暫且不去理會這個特性。

方括號的做用:[]

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

例:

jsvar reg = /^[abc]/;
//這個有點像/^(a|b|c)/
str='bbs.zhufengpeixun.cn';
alert(reg.exec(str));;
//返回結果是b。

例:

jsreg = /^[abc]/;
str='test';
alert(reg.exec(str));
//此次的結果就是null了。

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

jsreg = /^[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」結束的任意一個字符。

jsvar 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。則上邊的那個正則,也能夠寫成

jsvar reg=/^[\u0021-\u007a]$/;
// 字符「!」對應的16進制編碼是21,字符「z」的16進制編碼是7a。

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

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

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

反字符集合[^abc]

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

jsvar reg = /[^abc]/;
var str='blueidea';
alert(reg.exec(str));

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

例:

jsvar reg = /[^abc]/;
var str='cbazhufengpeixun';
alert(reg.exec(str));

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


邊界與非邊界

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

js/\bc/.exec('cainiao');
//返回結果c。匹配到了左邊界的c字符。
js/\bc/.exec('???c');
//仍然返回c,不過此次返回的是右側邊界的c。
js/\bc/.exec('bcb');
//此次匹配失敗,由於bcb字符串中的c被夾在中間,既不在左邊界也再也不右邊界。

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

js/\Bc/.exec('bcb');
//此次會成功地匹配到bcb中的c,。然而
js/\Bc/.exec('cainiao');
//則會返回null。由於\B告訴正則,只匹配非邊界的c。

數字與非數字

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

例:

js/\d/.exec('cainiao8')
//返回的匹配結果爲8,由於它是第一個數字字符。

例:

js/\D/.exec('cainiao8');
//返回c,第一個非數字字符。
相關文章
相關標籤/搜索