知識點總結-正則表達式

1.聲明方法

  • new RegExp()
var a= new RegExp('xyz');   //等同于/xyz/
var b= new RegExp("\\s");   //等同于/\s/
var c =new RegExp("\s");     //等同于/s/  這里注意 使用new聲明正則的時候如果存在轉譯就會消耗一個"\"符號
  • 直接書寫
var a=/xyz/;
var b=/\s/;

2.正則對象的屬性和方法

  • 修飾符屬性
    與修飾符有關的屬性,返回一個布爾值
    >ignoreCase :表示不區分大小寫
    >global :表示是否全局匹配
    >multiline :表示是否多行匹配
var a=/xyz/igm;
a.ignoreCase // true;
a.global         //true;
a.mulitline      //true;
  • 另外有一些與修飾符無關的屬性,主要有兩個
    >lastindex 下一次匹配的位置,要跟修飾符g一起用
    >source 正則的字符串形式
var a= /xyz/igm;
var b=/\s/igm;
a.lastindex;        //0 從頭開始
b.source  ;       //"\s"
  • 方法
    • test() 返回Boolean值 表示當前正則是否能夠匹配字符串
      >正則中沒有修飾符g,則只匹配一次
/x/.test("_x_x");
/y/.test("_x_x");

>正則中有修飾符g ,則多次匹配

var a=/x/g;
var s="_x_x";
a.test(s);       //true;
a.lastIndex;  //2;
a.test(s);      //true;
a.lastIndex   //4;
  • exec(): 如果發現匹配,則返回一個數組,如果沒有匹配 則返回null;
var s="_x_x";
/x/.exec(s);     //["x"]
/y/.exec(s)       //null

>使用exec()如果正則中有() 則含有組匹配 如果成功匹配 則返回的數組中第一個值是匹配成功的值,第二個值組內匹配的值 ,如果存在多個組匹配則數組長度+1,位置依次類推。

var a = /_(x)/;
a.exec("_x_x")  //["_x","x"]
var b=/a(b)(c)/;
b.exec("abc")   //  ["abc",b,c]

> 使用exec()返回的數組中有兩個屬性 一個是input 另一個是index

var a=/a(b+)a/g;
var s="_abbba_aba"
var a1=a.exec(s);
a1.index   //1 從字符串第二位成功匹配
a1.input   //"_abbba_aba" 匹配的原字符串

> 如果正則中含有修飾符g則可以多次使用exec()進行匹配

var a=/a(b+)a/g;
var s="_abbba_aba"
var a1=a.exec(s);
console.log(a1);            //["abbba","bbb"]
console.log(a.lastIndex);   //    6
var a2=a.exec(s);
console.log(a2);            //["aba","b"]
console.log(a.lastIndex);   //  10
var a3=a.exec(s);
console.log(a3);           // null             本次的匹配位置是10 字符串最大索引是9 所以null
console.log(a.lastIndex); //undefined
var a4=a.exec(s);
console.log(a4.index);                        //index=1 重新開始匹配
console.log(a3);           //["abbba","bbb"]       
console.log(a.lastIndex); //   6

3.字符串的屬性和方法

  • search
    >如果匹配成功則返回第一個滿足匹配字符串的位置,如果沒有匹配成功則返回-1
var s="_x_x";
s.match(/x/);       //1
s.match(/y/);       //-1
  • match
    >如果不帶修飾符g 則返回第一次匹配值組成的數組 如果沒有成功則返回null
var s="_x_x";
s.match(/x/);     //["x"]
s.match(/y/);      //null

>如果帶修飾符g 則返回所有匹配組成的數組

var s="_x_x";
s.match(/x/g);   //["x","x"]

>如果存在組匹配,如果成功匹配,數組的第一個值是匹配結果,第二個值是組內匹配結果,依次類推。

var s="_abba_aba";
s.match(/a(b+)a/);  ["abba","bb"]
  • split
    >函數調用:str.split(separator, [limit])
    返回值是一個數組。參數第一個參數可以是正則,第二個參數可以限定返回數組的長度,
var s="a, b,  c,d"
var arr=s.split(/,\s*/);           //其中\s* 代表匹配0到多個空格
console.log(arr)                     //["a", "b", "c", "d"]
var arr2=s.split(/,\s*/,2)      
console.log(arr2)                  //["a", "b"]
  • replace
    >函數調用:str.replace(search, replacement)replace()返回值是一個新的字符串。
    >>參數第一個值可以是正則 正則可以帶修飾符g,帶g的情況下會做全局匹配替換
var s="aaa"
var s1=s.replace(/a/,"b")         //s1="baa"
var s2=s.replace(/a/g,"b")       //s2="bbb"

>>參數第二個值可以是替換的字符串,也可以是$符號組成的參數,也可以是函數
$符號
$& 指代匹配的子字符串。
$` 指代匹配結果前面的文本。
$' 指代匹配結果后面的文本。 //其中'符號需要轉譯 $'
$n 指代匹配成功的第n組內容,n是從1開始的自然數。
$$ 指代美元符號$

var s1="hello world".replace(/(\w+) (\w+)/,"$2 $1");   //"world hello"
var s2=('abc').replace(/b/,"[$`-$&-$\']")                 //"a[a-b-c]c"      

function

var s='123';
var s2=s.replace(/\d/g,function(match){
  return match*2;
});                                                          //s2="246";

4.常用的一些寫法

<pre>
\d :匹配數字 相當于[0-9]
\w:匹配字母數字下劃線相當于[A-Za-z0-9_]
\s :匹配空格(包括制表符、空格符、斷行符等) 相當于[\t\n\r\v\f]
[a-zA-Z0-9]: 匹配所有字母和數字

5.特殊字符

\cX 表示Ctrl-[X],其中的X是A-Z之中任一個英文字母,用來匹配控制字符。
[\b] 匹配退格鍵(U+0008),不要與\b混淆。
\n 匹配換行鍵。
\r 匹配回車鍵。
\t 匹配制表符tab(U+0009)。
\v 匹配垂直制表符(U+000B)。
\f 匹配換頁符(U+000C)。
\0 匹配null字符(U+0000)。
\xhh 匹配一個以兩位十六進制數表示的字符。
\uhhhh 匹配一個以四位十六進制數表示的unicode字符。

6.貪婪模式與非貪婪模式(+、*、?)

+符號和*符號默認是盡可能的匹配更多的字符,這就是貪婪模式。
如果在后面加上問號,就會變成一旦滿足條件后就不再匹配 這就是非貪婪模式。
*?:表示某個模式出現0次或多次,匹配時采用非貪婪模式
+?:表示某個模式出現1次或多次,匹配時采用非貪婪模式。

/a+/.exec("aaa");           //["aaa"]
/a+?/.exec("aaa);          //["a"]       //滿足有一個a即可
/a+?b/.exec("aab")         //["aab"]    //滿足一個或者多個a后面有一個b
/a*?b/.exec("aab");           //["aab"]   //滿足0個或者多個a后面有一個b
/a*?b/.exec("b")                 //["b"]     //沒有a直接返回b

6.組匹配

  • 定義:就匹配就是用括號包裹起來形成一個整體
var s="abcabc"
s.match(/abc+/);              //["abc"]      沒有括號 只有c受到了加號的影響
s.match(/(abc)+/);            //["abcabc", "abc"]    
  • 組匹配可以使用\n來替代組中的內容,還可以嵌套使用
var s="abc_cab";
/(..)(.)_\2\1/.test(s);      //其中\2代表的是ab\1代表的是c
var s="abc_ab_abc";
/((..).)_\2_\1/.test(s);     //其中\2代表的是ab \1代表的是abc
  • 組匹配最大的應用就是用來匹配web標簽
var tag=/^<(\w+)>([^<]*)<\/\1>$/;
var match=tag.exec("<h1>我是頭標題</h1>")   //["<h1>我是頭標題</h1>", "h1", "我是頭標題"]
var html = '<b class="hello">Hello</b><i>world</i>';
var tag = /<(\w+)([^>]*)>(.*)<\/\1>/g;
var match1=tag.exec(html);            //["<b class="hello">Hello</b>", "b", " class="hello"", "Hello"]
var match2=tag.exec(html);            //["<i>world</i>", "i", "", "world"]

7.組匹配的其他用法

  • 非捕獲組 (?:x) 功能與普通的組匹配一樣,但是使用exec和字符串的match的時候不會返回組中的內容
var match1=/(?:.)b(.)/.exec("abc");    //["abc", "c"]
var match2="foolfool".match(/(?:foo)+(.)/);    //["fool", "l"]
  • 先行斷言x(?=y ) 就是x必須是在y的前面 y不會返回
/\d+(?=%)/.exec("99%");   //["99"]
  • 先行否定斷言x(?!y) 就是x不能在y的前面 也不會返回
/\d+(?![.])/.exec(3.14);   //[14]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容

  • RegExp 三大方法本文的RegExp采用直接量語法表示:/pattern/attributes。attribu...
    恩德_b0c2閱讀 471評論 0 0
  • 初衷:看了很多視頻、文章,最后卻通通忘記了,別人的知識依舊是別人的,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,040評論 0 20
  • re模塊手冊 本模塊提供了和Perl里的正則表達式類似的功能,不關是正則表達式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,035評論 0 13
  • 第一章 親密育兒法的由來 1、寶寶的挑剔、難以滿足是寶寶的性格,不是養育者的養育能力有問題; 2、寶寶的哭聲是一種...
    二喜小仙女閱讀 591評論 0 2
  • 前段時間看了小喜小嬋的一篇文章。什么才是真正的朋友?看完之后自己想了很多,我把小喜當朋友,但是我這個朋友做的真...
    如影隨行_形影相隨閱讀 226評論 2 2