4.選擇與分組 (1).分組 字元組[]:表示匹配若幹個字元之一 字元組可以淺顯的理解為一些字元的組合,字元組與普通字元的區別在於:abc普通字元表示匹配a接下來b接下來c而字元組[abc]表示在同一位置匹配a或者b或者c;由於字元組本身的含義也決定了可以將這個字元組看成是一個普通的特殊字元。 普通 ...
4.選擇與分組
(1).分組
字元組[]:表示匹配若幹個字元之一
字元組可以淺顯的理解為一些字元的組合,字元組與普通字元的區別在於:abc普通字元表示匹配a接下來b接下來c而字元組[abc]表示在同一位置匹配a或者b或者c;由於字元組本身的含義也決定了可以將這個字元組看成是一個普通的特殊字元。
普通性:普通是因為它也表示在一個位置上匹配一個字元對單個字元的操作在其上面也是可以起作用的;如:[a-z]{6};
特殊性:特殊是因為,1.其他字元在其內外的含義可能不同如:-,.,^等,2.在同一個位置可以有多中選擇,但這種選擇也只是限於一個字元;
各個字元在字元組內外的區別:
-:在字元組內部,表示一個範圍;在字元組外僅僅表示是一個字元;
例子:
-在字元組外
<script type="text/javascript"> var str = '2016-8-20'; var reg = /16-8/g; console.log(str.match(reg)); //16-8 </script>
-在字元組內
<script type="text/javascript"> var str = '2016-8-20'; reg = /1[6-8]/g; console.log(str.match(reg)); //16 </script>
-在字元組外是一個普通字元只表示-這個字元本身,所以匹配的是1接下來是6接下來是-接下來是8的這段字元串;所以是16-8
-在字元組內表示的是一個範圍,所以匹配的是1接下來是6到8之間的任意數字的字元所以是16;
.:在字元組內部表示一個點;在字元組外部表示任意字元(查找單個字元,除了換行和行結束符)。
.在字元組外
<script type="text/javascript"> var str = '2016-8-20'; var reg = /6.8/g; console.log(str.match(reg)); //6-8 </script>
.在字元組內
<script type="text/javascript"> var str = '2016-8-20'; var reg = /6[.]8/g; console.log(str.match(reg)); //null </script>
.在字元組外表示任意字元;所以匹配的是6接下來是任意一個字元接下來是8的一個字元串,所以匹配到的是6-8;
.在字元組內只是一個普通字元表示它本身;所以匹配的是6接下來是.接下來是8的一個字元串由於未匹配到所以為null;
對於字元組還可以分為匹配型字元組和排除型字元組主要是因為^的含義的變化
^: 脫字元;
例子:
^在字元組外
<script type="text/javascript"> var str = 'han'; var reg = /^ha/g; console.log(str.match(reg)); //ha </script>
^在字元組內
<script type="text/javascript"> var str = 'han'; var reg = /[^0-9]/g; console.log(str.match(reg)); // h,a,n </script>
脫字元在[]外部是一個錨點,表示匹配以某某字元開頭的字元或者字元串,在[]中有除了的意思
註意:[^a]表示匹配一個位置不等於a的字元,不要去理解成這個位置不是a就能匹配,後者的理解可以匹配一個空行,註意這個區別
例子:
<script type="text/javascript"> var str = 'han'; var reg = /n[^q]/g; console.log(str.match(reg)); //null </script>
註意:這個例子在n之後沒有任何字元,所以匹配的結果為空,如果按照上述的第二種理解可能就會認為匹配結果是:n
[]中不管有多少字元,在同一個位置只會匹配到其中的任意一個,如果說我要在一個位置上匹配一個字元串那又該如何呢?
(2).選擇
此時可以用()加|這個組合,|在正則表達式中是或者的意思,而()在正則表達式中劃分一個範圍;單獨的()使用時沒有意義的,只有當它和其他量詞共同使用才會體現出它的作用(先說下淺顯的例子,貪婪匹配和非貪婪匹配再單獨去說,這裡先不作說明);
例子:
<script type="text/javascript"> var str = '2016-8-20'; var reg = /(16-8)/g; console.log(str.match(reg)); //16-8 </script>
<script type="text/javascript"> var str = '2016-8-20'; var reg = /16-8/g; console.log(str.match(reg)); //16-8 </script>
這個例子有沒有括弧都一樣都表示匹配16-8這個字元串
當()和|一起使用則是一種多選結構,可以匹配任意子表達式()表示的是一個範圍;|表示的是一個選擇方向
例子:
<script type="text/javascript"> var str = 'greygray'; var reg = /gr[ea]y/g; console.log(str.match(reg)); // grey,gray reg = /gr(e|a)y/g; console.log(str.match(reg)); //grey,gray </script>
以上這兩種匹配的結果都是grey, gray也就是說(|)的分支選擇結構在一定程度上是可以和[]進行互相替代
例子:
<script type="text/javascript"> var str = 'greygray'; var reg = /gre|ay|yg/g; console.log(str.match(reg)); //gre,yg,ay </script>
輸出結果:gre,yg,ay
括弧的添加與否對結果的影響很大如:
^hello | world | hi :匹配的是 ^hello 或者 world 或者 hi
^(hello | world | hi):.匹配的起始行是 ^hello 或者 ^world 或者 ^ hi
註意:多選結構雖然有時候可以用字元組來表示,他倆之間可以互相表示,但是一個字元組只能匹配目標文本中的單個字元,而每個多選結構自身都可能是完整的正則,都可以匹配任意長度的文本
在正則表達式中需要註意的幾點:
1.在正則表達式中,空格字元也被視作一個規則字元;
2.-;.;*等在[]內和[]外的含義並不相同註意區別;註意元字元在字元組內外的區別;
3.當對幾個字元添加[]之後該字元串就被視作一個字元組,而對單個字元操作的?*等也可以對其使用,量詞之間的混合使用和量詞與分組選擇之間的混合會有一個貪婪和非貪婪匹配的概念,對此會單獨拿出總結;
4.分支結構和字元組的區別;分支可以匹配任意長度的文本;字元組只能匹配一個字元;
5.註意一些概念的理解:比如:[^x]表示‘匹配一個不等於x的字元’而不是’只有當這個位置不是x才能匹配’;[^x]後面的概念可以匹配一個空行在比如{x,y},?,*的理解;
6.在匹配中決定匹配是否成功的是{x,y}中的x,x對匹配成功與否起關鍵作用。
以上內容純屬個人總結,如有疑問請私信,如需轉載請註明出處。