### 基本語法
【基礎】
【界定符】 // #[]#
【原子】 原子:正則表達式中的最小匹配單位,一般它只是Unicode編碼表中的某一個字符。原子分爲2種,可見和不可見。
ASCII就是編碼英文的26個字母和一些常見的符號,以後擴展了一半。總之是一個字節來作編碼,大於128的部分是一些特殊符號。但ASCII是沒法編碼別的東西的,好比說是不存在「中文的ascii碼須要2個字符」這種說法的。ASCII就只有一個字節。
Unicode是足夠編碼地球上全部的語言了,因此ASCII中所能表示的,Unicode固然所有包括了。Unicode自己是隻有2個字節的,之因此出現UTF-8,UTF-16等等之類,那是爲了針對不一樣的應用環境,提升總體編碼效率,好比若是某篇文章裏絕大部分是英語(單字節就能表示),就比較適合使用utf-8,而若是絕大部分是中文(須要雙字節),utf-16
丨:匹配兩個或者多個分支選擇
[]:匹配方括號中的任意一個原子
[^]:匹配除方括號中的原子以外的任意字符
.:匹配除換行符以外的任意字符 [^\n]
\d:匹配任意一個十進制數字 [0-9]
\D:匹配任意一個非十進制數字 [^0-9]
\s:匹配一個不可見原子,例如空格、Tab、換行[\n\t\v]
\S:匹配一個可見原子 [^\n\t\v]
\w:匹配任意一個數字、字母或下劃線[0-9a-zA-z_]
\W:匹配任意一個非數字、非字母、非下劃線[^0-9a-zA-z_]
[\u4E00-\u9FA5]:匹配中文
【量詞】\w+(\.\w+)*@\w+(\.\w+)+$
{m}:表示其前面的原子剛好出現了n次
{n,}:表示其前面的原子最少出現了n次
{n,m}:表示其前面的原子最少出現n次,最多出現了m次
*:表示匹配0次、1次或者屢次其以前的原子,即{0,}
+:表示匹配1次或者屢次其以前的原子,即{1,}
?:匹配0次,或者1次其以前的原子,即{0,1}
【邊界控制】
^:匹配字符串開始的位置
$:匹配字符串結尾的位置
():匹配其中的總體爲一個原子
【模式單元】
Duang|duang
[Dd]uang
(D|d)uang
http://regexpal.isbadguy.com/ 正則調試
http://tool.oschina.net/encode Unicode轉碼
【進階】
【修正模式】
貪婪匹配與懶惰匹配
貪婪匹配 default
——匹配結果存在歧義時取其長
懶惰匹配 U
——匹配結果存在歧義時取其短
U 懶惰匹配
i 忽略大小寫
x 忽略空白
s 讓元字符‘.’匹配包含換行符在內的全部字符
### 正則匹配字符
正則表達式是匹配模式,要麼匹配字符,要麼匹配位置。請記住這句話。
然而關於正則如何匹配字符的學習,大部分人都以爲這塊比較雜亂。
畢竟元字符太多了,看起來沒有系統性,很差記。本文就解決這個問題。
內容包括:
1. 兩種模糊匹配
2. 字符組
3. 量詞
4. 分支結構
5. 案例分析
1. 兩種模糊匹配
若是正則只有精確匹配是沒多大意義的,好比/hello/,也只能匹配字符串中的"hello"這個子串。
var regex = /hello/;
console.log( regex.test("hello") ); // true
正則表達式之因此強大,是由於其能實現模糊匹配。
而模糊匹配,有兩個方向上的「模糊」:橫向模糊和縱向模糊。
1.1 橫向模糊匹配
橫向模糊指的是,一個正則可匹配的字符串的長度不是固定的,能夠是多種狀況的。
其實現的方式是使用量詞。表示譬如{m,n},表示連續出現最少m次,最多n次。
好比/ab{2,5}c/表示匹配這樣一個字符串:第一個字符是「a」,接下來是2到5個字符「b」,最後是字符「c」。測試以下:
var regex = /ab{2,5}c/g;
var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log( string.match(regex) ); // ["abbc", "abbbc", "abbbbc", "abbbbbc"]
注意:案例中用的正則是/ab{2,5}c/g,後面多了g,它是正則的一個修飾符。表示全局匹配,即在目標字符串中按順序找到知足匹配模式的全部子串,強調的是「全部」,而不僅是「第一個」。g是單詞global的首字母。
1.2 縱向模糊匹配
縱向模糊指的是,一個正則匹配的字符串,具體到某一位字符時,它能夠不是某個肯定的字符,能夠有多種可能。
其實現的方式是使用字符組。譬如[abc],表示該字符是能夠字符「a」、「b」、「c」中的任何一個。
好比/a[123]b/能夠匹配以下三種字符串:"a1b"、"a2b"、"a3b"。測試以下:
var regex = /a[123]b/g;
var string = "a0b a1b a2b a3b a4b";
console.log( string.match(regex) ); // ["a1b", "a2b", "a3b"]
以上就是本文講的主體內容,只要掌握橫向和縱向模糊匹配,就能解決很大部分正則匹配問題。
接下來的內容就是展開說了,若是對此都比較熟悉的話,能夠跳到最後,直接看案例那節。
2. 字符組
須要強調的是,雖叫字符組(字符類),但只是其中一個字符。例如[abc],表示匹配一個字符,它能夠是「a」、「b」、「c」之一。
2.1 範圍表示法
若是字符組裏的字符特別多的話,怎麼辦?可使用範圍表示法。
好比[123456abcdefGHIJKLM],能夠寫成[1-6a-fG-M]。用連字符"-"來省略和簡寫。
由於連字符有特殊用途,那麼要匹配「a」、「-」、「z」這三者中任意一個字符,該怎麼作呢?
不能寫成[a-z],由於其表示小寫字符中的任何一個字符。
能夠寫成以下的方式:[-az]或[az-]或[a\-z]。即要麼放在開頭,要麼放在結尾,要麼轉義。總之不會讓引擎認爲是範圍表示法就好了。
2.2 排除字符組
縱向模糊匹配,還有一種情形就是,某位字符能夠是任何東西,但就不能是"a"、"b"、"c"。
此時就是排除字符組(反義字符組)的概念。例如[^abc],表示是一個除"a"、"b"、"c"以外的任意一個字符。字符組的第一位放"^"(脫字符),表示求反的概念。
固然,也有相應的範圍表示法。
2.3 常見的簡寫形式
有了字符組的概念後,一些常見的符號咱們也就理解了。由於它們都是系統自帶的簡寫形式。
\d 就是[0-9]。表示是一位數字。記憶方式:其英文是digit(數字)。
\D 就是[^0-9]。表示除數字外的任意字符。
\w 就是[0-9a-zA-Z_]。表示數字、大小寫字母和下劃線。記憶方式:w是word的簡寫,也稱單詞字符。
\W 就是[^0-9a-zA-Z_]。非單詞字符。
\s 就是[ \t\v\n\r\f]。表示空白符,包括空格、水平製表符、垂直製表符、換行符、回車符、換頁符。記憶方式:s是space character的首字母。
\S 就是[^ \t\v\n\r\f]。 非空白符。
. 就是[^\n\r\u2028\u2029]。通配符,表示幾乎任意字符。換行符、回車符、行分隔符和段分隔符除外。記憶方式:想一想省略號...中的每一個點,均可以理解成佔位符,表示任何相似的東西。
若是要匹配任意字符怎麼辦?可使用[\d\D]、[\w\W]、[\s\S]和[^]中任何的一個。
3. 量詞
量詞也稱重複。掌握{m,n}的準確含義後,只須要記住一些簡寫形式。
3.1 簡寫形式
{m,} 表示至少出現m次。
{m} 等價於{m,m},表示出現m次。
? 等價於{0,1},表示出現或者不出現。記憶方式:問號的意思表示,有嗎?
+ 等價於{1,},表示出現至少一次。記憶方式:加號是追加的意思,得先有一個,而後才考慮追加。
* 等價於{0,},表示出現任意次,有可能不出現。記憶方式:看看天上的星星,可能一顆沒有,可能零散有幾顆,可能數也數不過來。
3.2 貪婪匹配和惰性匹配
看以下的例子:
var regex = /\d{2,5}/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) ); // ["123", "1234", "12345", "12345"]
其中正則/\d{2,5}/,表示數字連續出現2到5次。會匹配2位、3位、4位、5位連續數字。
可是其是貪婪的,它會盡量多的匹配。你能給我6個,我就要5個。你能給我3個,我就3要個。反正只要在能力範圍內,越多越好。
咱們知道有時貪婪不是一件好事(請看文章最後一個例子)。而惰性匹配,就是儘量少的匹配:
var regex = /\d{2,5}?/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) ); // ["12", "12", "34", "12", "34", "12", "34", "56"]
其中/\d{2,5}?/表示,雖然2到5次都行,當2個就夠的時候,就不在往下嘗試了。
經過在量詞後面加個問號就能實現惰性匹配,所以全部惰性匹配情形以下:
{m,n}?
{m,}?
??
+?
*?
對惰性匹配的記憶方式是:量詞後面加個問號,問一問你滿足了嗎,你很貪婪嗎?
4. 多選分支
一個模式能夠實現橫向和縱向模糊匹配。而多選分支能夠支持多個子模式任選其一。
具體形式以下:(p1|p2|p3),其中p一、p2和p3是子模式,用「|」(管道符)分隔,表示其中任何之一。
例如要匹配"good"和"nice"可使用/good|nice/。測試以下:
var regex = /good|nice/g;
var string = "good idea, nice try.";
console.log( string.match(regex) ); // ["good", "nice"]
但有個事實咱們應該注意,好比我用/good|goodbye/,去匹配"goodbye"字符串時,結果是"good":
var regex = /good|goodbye/g;
var string = "goodbye";
console.log( string.match(regex) ); // ["good"]
而把正則改爲/goodbye|good/,結果是
var regex = /goodbye|good/g;
var string = "goodbye";
console.log( string.match(regex) ); // ["goodbye"]
也就是說,分支結構也是惰性的,即當前面的匹配上了,後面的就再也不嘗試了。
5. 案例分析
匹配字符,無非就是字符組、量詞和分支結構的組合使用罷了。
下面找幾個例子演練一下(其中,每一個正則並非只有惟一寫法):
5.1 匹配16進制顏色值
要求匹配:
#ffbbad
#Fc01DF
#FFF
#ffE
分析:
表示一個16進制字符,能夠用字符組[0-9a-fA-F]。
其中字符能夠出現3或6次,須要是用量詞和分支結構。
使用分支結構時,須要注意順序。
正則以下:
var regex = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g;
var string = "#ffbbad #Fc01DF #FFF #ffE";
console.log( string.match(regex) ); // ["#ffbbad", "#Fc01DF", "#FFF", "#ffE"]
5.2 匹配時間
以24小時製爲例。
要求匹配:
23:59
02:07
分析:
共4位數字,第一位數字能夠爲[0-2]。
當第1位爲2時,第2位能夠爲[0-3],其餘狀況時,第2位爲[0-9]。
第3位數字爲[0-5],第4位爲[0-9]
正則以下:
var regex = /^([01][0-9]|[2][0-3]):[0-5][0-9]$/;
console.log( regex.test("23:59") ); // true
console.log( regex.test("02:07") ); // true
若是也要求匹配7:9,也就是說時分前面的0能夠省略。
此時正則變成:
var regex = /^(0?[0-9]|1[0-9]|[2][0-3]):(0?[0-9]|[1-5][0-9])$/;
console.log( regex.test("23:59") ); // true
console.log( regex.test("02:07") ); // true
console.log( regex.test("7:9") ); // true
5.3 匹配日期
好比yyyy-mm-dd格式爲例。
要求匹配:
2017-06-10
分析:
年,四位數字便可,可用[0-9]{4}。
月,共12個月,分兩種狀況0一、0二、……、09和十、十一、12,可用(0[1-9]|1[0-2])。
日,最大31天,可用(0[1-9]|[12][0-9]|3[01])。
正則以下:
var regex = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/;
console.log( regex.test("2017-06-10") ); // true
5.4 window操做系統文件路徑
要求匹配:
F:\study\javascript\regex\regular expression.pdf
F:\study\javascript\regex\
F:\study\javascript
F:\
分析:
總體模式是: 盤符:\文件夾\文件夾\文件夾\
其中匹配F:\,須要使用[a-zA-Z]:\\,其中盤符不區分大小寫,注意\字符須要轉義。
文件名或者文件夾名,不能包含一些特殊字符,此時咱們須要排除字符組[^\\:*<>|"?\r\n/]來表示合法字符。另外不能爲空名,至少有一個字符,也就是要使用量詞+。所以匹配「文件夾\」,可用[^\\:*<>|"?\r\n/]+\\。
另外「文件夾\」,能夠出現任意次。也就是([^\\:*<>|"?\r\n/]+\\)*。其中括號提供子表達式。
路徑的最後一部分能夠是「文件夾」,沒有\,所以須要添加([^\\:*<>|"?\r\n/]+)?。
最後拼接成了一個看起來比較複雜的正則:
var regex = /^[a-zA-Z]:\\([^\\:*<>|"?\r\n/]+\\)*([^\\:*<>|"?\r\n/]+)?$/;
console.log( regex.test("F:\\study\\javascript\\regex\\regular expression.pdf") ); // true
console.log( regex.test("F:\\study\\javascript\\regex\\") ); // true
console.log( regex.test("F:\\study\\javascript") ); // true
console.log( regex.test("F:\\") ); // true
其中,JS中字符串表示「\」時,也要轉義。
5.5 匹配id
要求從
<div id="container" class="main"></div>
提取出id="container"。
可能最開始想到的正則是:
var regex = /id=".*"/
var string = '<div id="container" class="main"></div>';
console.log(string.match(regex)[0]); // id="container" class="main"
由於.是通配符,自己就匹配雙引號的,而量詞*又是貪婪的,當遇到container後面雙引號時,不會停下來,會繼續匹配,直到遇到最後一個雙引號爲止。
解決之道,可使用惰性匹配:
var regex = /id=".*?"/
var string = '<div id="container" class="main"></div>';
console.log(string.match(regex)[0]); // id="container"
固然,這樣也會有個問題。效率比較低,由於其匹配原理會涉及到「回溯」這個概念(這裏也只是順便提一下,後續文章會說明)。能夠優化以下:
var regex = /id="[^"]*"/
var string = '<div id="container" class="main"></div>';
console.log(string.match(regex)[0]); // id="container"
後記
字符匹配相關的案例,挺多的,不一而足。
掌握字符組和量詞就能解決大部分常見的情形,也就是說,當你會了這兩者,JS正則算是入門了。
感謝你看到這裏,本文也要結束了。
若是有更好的例子,也能夠幫我補充補充。
也歡迎關注本系列,不妨看看下一篇《正則表達式位置匹配攻略》。
最後,咱們該想到,陸游詩人對前端作的最大貢獻是:
紙上得來終覺淺,絕知此事要躬行。
本文完。
### 正則匹配位置
正則表達式是匹配模式,要麼匹配字符,要麼匹配位置。請記住這句話。
然而大部分人學習正則時,對於匹配位置的重視程度沒有那麼高。
本文講講正則匹配位置的總總。
內容包括:
1. 什麼是位置?
2. 如何匹配位置?
3. 位置的特性
4. 幾個應用實例分析
1. 什麼是位置呢?
位置是相鄰字符之間的位置。好比,下圖中箭頭所指的地方:
2. 如何匹配位置呢?
在ES5中,共有6個錨字符:
^ $ \b \B (?=p) (?!p)
2.1 ^和$
^(脫字符)匹配開頭,在多行匹配中匹配行開頭。
$(美圓符號)匹配結尾,在多行匹配中匹配行結尾。
好比咱們把字符串的開頭和結尾用"#"替換(位置能夠替換成字符的!):
var result = "hello".replace(/^|$/g, '#');
console.log(result); // "#hello#"
多行匹配模式時,兩者是行的概念,這個須要咱們的注意:
var result = "I\nlove\njavascript".replace(/^|$/gm, '#');
console.log(result);
/*
#I#
#love#
#javascript#
*/
2.2 \b和\B
\b是單詞邊界,具體就是\w和\W之間的位置,也包括\w和^之間的位置,也包括\w和$之間的位置。
好比一個文件名是"[JS] Lesson_01.mp4"中的\b,以下:
var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#');
console.log(result); // "[#JS#] #Lesson_01#.#mp4#"
爲何是這樣呢?這須要仔細看看。
首先,咱們知道,\w是字符組[0-9a-zA-Z_]的簡寫形式,即\w是字母數字或者下劃線的中任何一個字符。而\W是排除字符組[^0-9a-zA-Z_]的簡寫形式,即\W是\w之外的任何一個字符。
此時咱們能夠看看"[#JS#] #Lesson_01#.#mp4#"中的每個"#",是怎麼來的。
第一個"#",兩邊是"["與"J",是\W和\w之間的位置。
第二個"#",兩邊是"S"與"]",也就是\w和\W之間的位置。
第三個"#",兩邊是空格與"L",也就是\W和\w之間的位置。
第四個"#",兩邊是"1"與".",也就是\w和\W之間的位置。
第五個"#",兩邊是"."與"m",也就是\W和\w之間的位置。
第六個"#",其對應的位置是結尾,但其前面的字符"4"是\w,即\w和$之間的位置。
知道了\b的概念後,那麼\B也就相對好理解了。
\B就是\b的反面的意思,非單詞邊界。例如在字符串中全部位置中,扣掉\b,剩下的都是\B的。
具體說來就是\w與\w、\W與\W、^與\W,\W與$之間的位置。
好比上面的例子,把全部\B替換成"#":
var result = "[JS] Lesson_01.mp4".replace(/\B/g, '#');
console.log(result); // "#[J#S]# L#e#s#s#o#n#_#0#1.m#p#4"
2.3 (?=p)和(?!p)
(?=p),其中p是一個子模式,即p前面的位置。
好比(?=l),表示'l'字符前面的位置,例如:
var result = "hello".replace(/(?=l)/g, '#');
console.log(result); // "he#l#lo"
而(?!p)就是(?=p)的反面意思,好比:
var result = "hello".replace(/(?!l)/g, '#');
console.log(result); // "#h#ell#o#"
兩者的學名分別是positive lookahead和negative lookahead。
中文翻譯分別是正向先行斷言和負向先行斷言。
ES6中,還支持positive lookbehind和negative lookbehind。
具體是(?<=p)和(?<!p)。
也有書上把這四個東西,翻譯成環視,即看看左邊或看看右邊。
但通常書上,沒有很好強調這四者是個位置。
好比(?=p),通常都理解成:要求接下來的字符與p匹配,但不能包括p的那些字符。
而在本人看來(?=p)就與^同樣好理解,就是p前面的那個位置。
3. 位置的特性
對於位置的理解,咱們能夠理解成空字符""。
好比"hello"字符串等價於以下的形式:
"hello" == "" + "h" + "" + "e" + "" + "l" + "" + "l" + "o" + "";
也等價於:
"hello" == "" + "" + "hello"
所以,把/^hello$/寫成/^^hello$$$/,是沒有任何問題的:
var result = /^^hello$$$/.test("hello");
console.log(result); // true
甚至能夠寫成更復雜的:
var result = /(?=he)^^he(?=\w)llo$\b\b$/.test("hello");
console.log(result); // true
也就是說字符之間的位置,能夠寫成多個。
把位置理解空字符,是對位置很是有效的理解方式。
4. 相關案例
4.1 不匹配任何東西的正則
讓你寫個正則不匹配任何東西
easy,/.^/
由於此正則要求只有一個字符,但該字符後面是開頭。
4.2 數字的千位分隔符表示法
好比把"12345678",變成"12,345,678"。
可見是須要把相應的位置替換成","。
思路是什麼呢?
4.2.1 弄出最後一個逗號
使用(?=\d{3}$)就能夠作到:
var result = "12345678".replace(/(?=\d{3}$)/g, ',')
console.log(result); // "12345,678"
4.2.2 弄出全部的逗號
由於逗號出現的位置,要求後面3個數字一組,也就是\d{3}至少出現一次。
此時可使用量詞+:
var result = "12345678".replace(/(?=(\d{3})+$)/g, ',')
console.log(result); // "12,345,678"
4.2.3 匹配其他案例
寫完正則後,要多驗證幾個案例,此時咱們會發現問題:
var result = "123456789".replace(/(?=(\d{3})+$)/g, ',')
console.log(result); // ",123,456,789"
由於上面的正則,僅僅表示把從結尾向前數,一可是3的倍數,就把其前面的位置替換成逗號。所以纔會出現這個問題。
怎麼解決呢?咱們要求匹配的到這個位置不能是開頭。
咱們知道匹配開頭可使用^,但要求這個位置不是開頭怎麼辦?
easy,(?!^),你想到了嗎?測試以下:
var string1 = "12345678",
string2 = "123456789";
reg = /(?!^)(?=(\d{3})+$)/g;
var result = string1.replace(reg, ',')
console.log(result); // "12,345,678"
result = string2.replace(reg, ',');
console.log(result); // "123,456,789"
4.2.4 支持其餘形式
若是要把"12345678 123456789"替換成"12,345,678 123,456,789"。
此時咱們須要修改正則,把裏面的開頭^和結尾$,替換成\b:
var string = "12345678 123456789",
reg = /(?!\b)(?=(\d{3})+\b)/g;
var result = string.replace(reg, ',')
console.log(result); // "12,345,678 123,456,789"
其中(?!\b)怎麼理解呢?
要求當前是一個位置,但不是\b前面的位置,其實(?!\b)說的就是\B。
所以最終正則變成了:/\B(?=(\d{3})+\b)/g
4.3 驗證密碼問題
密碼長度6-12位,由數字、小寫字符和大寫字母組成,但必須至少包括2種字符。
此題,若是寫成多個正則來判斷,比較容易。但要寫成一個正則就比較困難。
那麼,咱們就來挑戰一下。看看咱們對位置的理解是否深入。
4.3.1 簡化
不考慮「但必須至少包括2種字符」這一條件。咱們能夠容易寫出:
var reg = /^[0-9A-Za-z]{6,12}$/;
4.3.2 判斷是否包含有某一種字符
假設,要求的必須包含數字,怎麼辦?此時咱們可使用(?=.*[0-9])來作。
所以正則變成:
var reg = /(?=.*[0-9])^[0-9A-Za-z]{6,12}$/;
4.3.3 同時包含具體兩種字符
好比同時包含數字和小寫字母,能夠用(?=.*[0-9])(?=.*[a-z])來作。
所以正則變成:
var reg = /(?=.*[0-9])(?=.*[a-z])^[0-9A-Za-z]{6,12}$/;
4.3.4 解答
咱們能夠把原題變成下列幾種狀況之一:
1.同時包含數字和小寫字母
2.同時包含數字和大寫字母
3.同時包含小寫字母和大寫字母
4.同時包含數字、小寫字母和大寫字母
以上的4種狀況是或的關係(實際上,能夠不用第4條)。
最終答案是:
var reg = /((?=.*[0-9])(?=.*[a-z])|(?=.*[0-9])(?=.*[A-Z])|(?=.*[a-z])(?=.*[A-Z]))^[0-9A-Za-z]{6,12}$/;
console.log( reg.test("1234567") ); // false 全是數字
console.log( reg.test("abcdef") ); // false 全是小寫字母
console.log( reg.test("ABCDEFGH") ); // false 全是大寫字母
console.log( reg.test("ab23C") ); // false 不足6位
console.log( reg.test("ABCDEF234") ); // true 大寫字母和數字
console.log( reg.test("abcdEF234") ); // true 三者都有
4.3.5 解惑
上面的正則看起來比較複雜,只要理解了第二步,其他就所有理解了。
/(?=.*[0-9])^[0-9A-Za-z]{6,12}$/
對於這個正則,咱們只須要弄明白(?=.*[0-9])^便可。
分開來看就是(?=.*[0-9])和^。
表示開頭前面還有個位置(固然也是開頭,即同一個位置,想一想以前的空字符類比)。
(?=.*[0-9])表示該位置後面的字符匹配.*[0-9],即,有任何多個任意字符,後面再跟個數字。
翻譯成大白話,就是接下來的字符,必須包含個數字。
4.3.6 另一種解法
「至少包含兩種字符」的意思就是說,不能所有都是數字,也不能所有都是小寫字母,也不能所有都是大寫字母。
那麼要求「不能所有都是數字」,怎麼作呢?(?!p)出馬!
對應的正則是:
var reg = /(?!^[0-9]{6,12}$)^[0-9A-Za-z]{6,12}$/;
三種「都不能」呢?
最終答案是:
var reg = /(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/;
console.log( reg.test("1234567") ); // false 全是數字
console.log( reg.test("abcdef") ); // false 全是小寫字母
console.log( reg.test("ABCDEFGH") ); // false 全是大寫字母
console.log( reg.test("ab23C") ); // false 不足6位
console.log( reg.test("ABCDEF234") ); // true 大寫字母和數字
console.log( reg.test("abcdEF234") ); // true 三者都有
後記
位置匹配相關的案例,挺多的,不一而足。
感謝你看到這裏,本文也要結束了。
若是有更好的例子,也能夠幫我補充補充。
最後,咱們該想到,陸游詩人對前端作的最大貢獻是:
紙上得來終覺淺,絕知此事要躬行。
本文完。