javascript 正則表達式 (第一彈)

在JavaScript中,正則表達式也是對象。這種模式能夠被用於 RegExp 的 exec 和 test 方法以及 String 的 match、replace、search 和 split 方法。

建立正則表達式
第一種使用正則表達式字面量。
//example
var re = /a/igm; //i 不區分大小寫 g全局匹配 m多行
複製代碼
第二種調用RegExp構造函數。

調用RegExp對象的方法,參數只支持字符串。在ES6版本開始支持字面量和變量當參數。前端

//example
var re  = new RegExp('a','igm');
複製代碼
正則表達式的元字符

常見的元字符正則表達式

^	//匹配字符串的開始
$	//匹配字符串的結束
.	//匹配除換行符之外的任意字符
\w	//匹配字母或數字或下劃線或漢字
\s	//匹配任意的空白符
\d	//匹配數字
\b	//匹配單詞的開始或結束
複製代碼
'^' 匹配開始位置。

匹配字符開始位置bash

//匹配字符串的開始
/^a/.test('ba');
false
/^a/.test('ab');
true
//例如相匹配以數字開始數字字母或下劃線結尾的字符串。
/^\d+\w+/.test('98273918jdsdhkajsd')
true
/\d+\w+/.test('98273918jdsdhkajsd')
true
//若是沒有加^,就會匹配不許確。
/\d+\w+/.test('ldksjaksjd98273918jdsdhkajsd')
true
複製代碼

若是多行標示被設置爲true,同時匹配換行後緊跟的字符。函數

//example
var str = "first second\nthird fourth\nfifth sixth";
var patt = /^(\w+)/gm;
console.log(str.match(patt));
["first", "third", "fifth"]
複製代碼

字符出如今一個字符集合模式的第一個字符的時候. 表示匹配非字符集合裏邊的字符。學習

//example
/[^abc]/.test('abc');
false
/[^abc]/.test('c');
false
/[^abc]/.test('kjhkjh');
true
複製代碼
'$' 匹配字符串結尾位置
//example
/a$/.test('abc');
false
/a$/.test('abca');
true
//同匹配開始字符同樣 添加一個限制。
複製代碼
'/^xxx$/' 準確匹配 例如校驗手機號 郵箱 身份證號 密碼格式 ...
//example
//只匹配字符串'a'
/^a$/.test('a');
true
/^a$/.test('aa');
false
//只匹配字符串'5-11位的數字 例如QQ'
/^\d{5,11}$/.test('123');
false
/^\d{5,11}$/.test('1237657');
//若是不加會出現如下匹配不許確,正則只要匹配到符合規則的就會返回true
/\d{5,11}/.test('aaaa1237657');
true
/\d{5,11}/.test('aaaa1237657lll');
true
複製代碼
'\w' 匹配字母或數字或下劃線或漢字
//example
/\w+/.test('987987hbdkjahsiuyo979')
true
/\w+/.test('987987')
true
/\w+/.test('kjhkhkhj')
true
/\w+/.test('kj1312_')
true
/\w+/.test('kj1312_你好')
true

//須要注意的是 匹配密碼或者郵箱... 的時候不要直接用\w 由於出現中文也會匹配成功。 最好寫[a-zA-Z]\d_。
複製代碼
'' 轉義符

/b/匹配字符串b,/\b/ 反斜槓一般在正則裏邊是轉義,把字符轉移成特殊意義的字符。意思是匹配一個字符邊界。 好比:/\bs/ 其實就是匹配字符串是以空格s' s'開始的字符串。spa

//example
var re = /\ba/;
undefined
re.test('ba');
false
re.test('ab');
true
複製代碼
'*' 特殊字符轉義爲普通字符

相反\ 也會把特殊字符轉移成普通字符串 例如:* 表明着前一項匹配0次或者屢次的特殊字符,/a*/ 匹配最少一個a或者多個連續'aaa',而a/*就只能匹配字符串a*code

//example
var re = /a*/;
re.test('a');
true
re.test('aa');
true
re.test('aaaaaaaaa');
true
var re = /a\*/;
re.test('a');
false
re.test('a*');
true
複製代碼
'' 自己用在字符串裏邊是也須要轉義

例如:你相匹配字符串'a\b'對象

//example
/a\\/.test('a\\');
true
/a\\/.test('ab\\');
false
**'ab\\' // 字符串自己的反斜槓也是須要轉義的。**
複製代碼
重複
* 重複零次或更屢次
//example
/a*/.test('aaaa')
true
/a*/.test('')
true
/a*/.test('a')
true
複製代碼
+ 重複一次或更屢次
//example
/a*/.test('aaaa')
true
/a*/.test('')
false
/a*/.test('a')
true
複製代碼
? 重複零次或一次
//example
/a*/.test('aaaa')
false
/a*/.test('')
true
/a*/.test('a')
true
複製代碼
{n} 重複n次
//example
/a{1}/.test('a')
true
/a{2}/.test('a')
false
/a{5}/.test('aaaaa')
true
複製代碼
{n,} 重複n次或更屢次
//example
/^a{1,}$/.test('aaaaaa')
true
/^a{1,}$/.test('a')
true
/^a{2,}$/.test('a')
false
複製代碼
{n,m} 重複n到m次
//example
/^a{1,5}$/.test('aaaaaaa')
false
/^a{1,5}$/.test('')
false
/^a{1,5}$/.test('aa')
true
/^a{1,5}$/.test('aaaaa')
true
/^a{1,5}$/.test('aaaaaa')
false
複製代碼
反義
\W 匹配任意不是字母,數字,下劃線,漢字的字符
//example
/\W/.test('@')
true
/\W/.test('1')
false
/\W/.test('a')
false
/\W/.test('!')
true
/\W/.test('hjdgsjahg!!!')
true
/^\W$/.test('hjdgsjahg!!!')
false
複製代碼
\S 匹配任意不是空白符的字符
//example
/\S/.test('')
false
/\S/.test('1')
true
/\S/.test('jsdhaj12121!@#')
true
複製代碼
\D 匹配任意非數字的字符
//example
/^\D$/.test('q')
true
/^\D$/.test('qkjshdj')
false
/^\D+$/.test('qkjshdj')
true
/^\D+$/.test('1')
false
/^\D+$/.test('13423')
false
/^\D$/.test('13423')
false
複製代碼
\B 匹配不是單詞開頭或結束的位置
//example
/\B/.test('1jkdsh')
true
/\B$/.test('1jkdsh')
false
/^\B/.test('1jkdsh')
false
/^\B/.test(' 1jkdsh')
true
複製代碼
[^x] 匹配除了x之外的任意字符
//example
/[^a]/.test('a')
false
/[^a]/.test('b')
true
/[^a]/.test('bs')
true
/[^a]/.test('bsdsjkhd')
true
複製代碼

//exampleip

[^aeiou] 匹配除了aeiou這幾個字母之外的任意字符
/[^aeiou]/.test('bsdsjkhd')
true
/[^aeiou]/.test('bsdsjkhdi')
true
/[^aeiou]/.test('a')
false
/[^aeiou]/.test('aeiou')
false
/[^aeiou]/.test('akjdhk')
true
/[^aeiou]/.test('u')
false
/[^aeiou]/.test('us')
true
複製代碼
替換 和 '|'

不知道爲何叫替換 我感受就是用'或'來匹配的字符串

例如匹配 電話號碼(座機)'規則前邊3位區號後邊八位數字|前邊四位數字區號後邊7位數字 前邊區號首數字爲0 後邊數字第一位不爲零',正則表達式裏的替換指的是有幾種規則,若是知足其中任意一種規則都應該當成匹配,具體方法是用|把不一樣的規則分隔開。

//example
例如規則:(010)87654321 010-87654321 0311-8765432 (0311)8765432
//匹配前三位區號後8位區號
/0\d{2}-[1-9]{1}\d{7}/.test('010-85697103')
true
//匹配區號三位或者四位的電話
/0\d{2}-[1-9]{1}\d{7}|0\d{3}-[1-9]{1}\d{6}/.test('010-85697103')
true
//匹配區號三位或者四位或者被小括號括起來的的,後邊是7位或者8位的電話號碼
/\(0\d{2}\)[1-9]{1}\d{7}|\(0\d{3}\)[1-9]{1}\d{6}|0\d{2}-[1-9]{1}\d{7}|0\d{3}-[1-9]{1}\d{6}/.test('0311-8569710')
true
/\(0\d{2}\)[1-9]{1}\d{7}|\(0\d{3}\)[1-9]{1}\d{6}|0\d{2}-[1-9]{1}\d{7}|0\d{3}-[1-9]{1}\d{6}/.test('(0311)8765432')
true
/\(0\d{2}\)[1-9]{1}\d{7}|\(0\d{3}\)[1-9]{1}\d{6}|0\d{2}-[1-9]{1}\d{7}|0\d{3}-[1-9]{1}\d{6}/.test('0311-8765432')
true
/\(0\d{2}\)[1-9]{1}\d{7}|\(0\d{3}\)[1-9]{1}\d{6}|0\d{2}-[1-9]{1}\d{7}|0\d{3}-[1-9]{1}\d{6}/.test('031-87654321')
true
//注:如下是爲何呢?? 由於沒有開始結尾符。正則表達式匹配的時候 匹配到合適的就會返回true 因此在校驗時最好加上開始結尾符。
/\(0\d{2}\)[1-9]{1}\d{7}|\(0\d{3}\)[1-9]{1}\d{6}|0\d{2}-[1-9]{1}\d{7}|0\d{3}-[1-9]{1}\d{6}/.test('031-87654321比較好開獎號')
true
//正確的寫法
/^\(0\d{2}\)[1-9]{1}\d{7}$|^\(0\d{3}\)[1-9]{1}\d{6}$|^0\d{2}-[1-9]{1}\d{7}$|^0\d{3}-[1-9]{1}\d{6}$/.test('031-87654321比較好開獎號')
false
/^\(0\d{2}\)[1-9]{1}\d{7}$|^\(0\d{3}\)[1-9]{1}\d{6}$|^0\d{2}-[1-9]{1}\d{7}$|^0\d{3}-[1-9]{1}\d{6}$/.test('031-87654321')
true
/^\(0\d{2}\)[1-9]{1}\d{7}$|^\(0\d{3}\)[1-9]{1}\d{6}$|^0\d{2}-[1-9]{1}\d{7}$|^0\d{3}-[1-9]{1}\d{6}$/.test('0311-8765431')
true
複製代碼
分組

上邊介紹了單個字符重複匹配 a* 相似這個。重複一個字符串又該怎麼辦?當!當!當!看這裏! 你能夠用小括號來指定子表達式(也叫作分組),而後你就能夠指定這個子表達式的重複次數了,你也能夠對子表達式進行其它一些操做

//ip地址匹配 規則四組數字每組1-3個數字 每一組數字用.隔開 每組數字不能大於255

//example
/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test('1.3.4.5')
true
/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test('134.345.4.5')
false
/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test('134.245.254.125')
true
/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test('234.456.678.789')
false
複製代碼

(2[0-4]\d|25[0-5]|[01]?\d\d?) 重要的是看明白這個正則, 2[0-4]\d 第一位2開始第二位0-4第三位\d 25[0-5] 若是前兩位是25第三位0-5 才能保證不會大於255 [01]?\d\d? 若是第一位0或者1無關緊要 第二位\d 第三位\d無關緊要 再沒看明白給我十塊錢我再給你嘮一遍 重申一遍別忘了寫^$

反向引用

反向引用的做用一般是用來查找或限定重複、查找或限定指定標識配對出現等等。 反向引用必需要和捕獲組一同使用

反向引用「\1」的限制,要求必須是兩個相同的字符

example:

//example
var str = 'aabb';
str.match(/([ab])\1/)
["aa", "a"]
var str = 'bbaa';
str.match(/([ab])\1/)
["bb", "b"]
複製代碼
\1{x} {x} 匹配的個數是x+1;
var str = 'bbaa';
str.match(/([ab])\1{2}/)
null
var str = 'bbaaa';
str.match(/([ab])\1{2}/)
["aaa", "a"]
var str = 'bbbaaa';
str.match(/([ab])\1{2}/)
["bbb", "b"]
複製代碼
複雜一點的
'aa'.match(/(\w)((?=\1\1\1)(\1))+/)
null
'aaaa'.match(/(\w)((?=\1\1\1)(\1))+/)
["aa", "a", "a", "a"]
'aaa'.match(/(\w)((?=\1\1\1)(\1))+/)
null
'aaa'.match(/(\w)((?=\1\1)(\1))+/)
["aa", "a", "a", "a"]
'aaa'.match(/(\w)((?=\1)(\1))+/)
["aaa", "a", "a", "a"]
'aaa'.match(/(\w)((?=\1)(\1))/)
["aa", "a", "a", "a"]
複製代碼
千分符
'100000000'.replace(/\B(?=(\d{3})+$)/g,',');
"100,000,000"
複製代碼

\B 匹配不是開始或者結尾的位置 ?=exp 匹配 exp前面的位置

//再來一個例子
'http://www.pkbug.com/jpg/kjdskddlk/img.jpg'.replace(/(jpg(?=(\/|\b)))+/g,'png');
"http://www.pkbug.com/png/kjdskddlk/img.png"

'http://www.pkbug.com/jpg/kjdskddlk/img.jpg'.replace(/(\w{1}(?=(\/|\b)))+/g,'png');
"httpng://wwpng.pkbupng.copng/jppng/kjdskddlpng/impng.jppng"
//就是前邊寫要匹配的規則 相似jpg  \w 後邊(?= exp  exp就是jpg或者\w後邊有什麼 例若有/  經過/ 來找jpg)
複製代碼
(?:exp) 分組不捕獲
/industr(?:y|ies)/.test('industries')
true
'aaa'.match(/(?:\w)\1/)
null
複製代碼
其餘 ?...
倆字'前端不支持'
(?<=exp)	匹配exp後面的位置
(?<!exp)	匹配前面不是exp的位置
註釋	(?#comment)
複製代碼
貪婪與懶惰

最後聊一下正則的貪婪和懶惰。

###### 貪婪

*	重複零次或更屢次
+	重複一次或更屢次

//當正則表達式包含重複的限定符時,會盡量多的去匹配。
'aakjhjkakjhaaahkjahkajha'.match(/a.*a/);
["aakjhjkakjhaaahkjahkajha"]  //匹配結果 是儘量的多匹配 這種一般咱們說是貪婪匹配
複製代碼
懶惰

有時候咱們須要匹配儘可能少的字符 咱們就聊一下懶惰 賊簡單。

'aakjhjkakjhaaahkjahkajha'.match(/a.*?a/);
["aa"]
'aakjhjkakjhaaahkjahkajha'.match(/a.*?/);
["a"]

//很明顯在重複限定符後邊加一個? 匹配零次或者一次 這樣就會變成儘可能少的匹配。
複製代碼

聊到如今正則也聊差很少了。固然這只是我瞭解的一丟丟東西 若有其它正則需求請留言。一塊學習學習。我有什麼新學到的東西也會及時更新上來 謝謝關注!

相關文章
相關標籤/搜索