來源於:《JavaScript 忍者祕籍》前端
前端之路 系列 繼續 來聊一聊 正則表達式!java
表示匹配一類的字符集,由正則表達式的語法提供。以下:git
預預約術語 | 匹配內容 |
---|---|
. | 匹配處理新行\n以外的任意字符 |
\s | 空白字符 |
\S | 非空白字符 |
\w | 能夠構成單詞的字符 |
\W | 不能構成單詞的字符 |
\d | 數字 |
\D | 非數字 |
\b | 單詞的邊界 |
\B | 不是單詞的邊界 |
\t | 水平製表符 |
\v | 垂直製表符 |
\f | 換頁符 |
\r | 回車符 |
\n | 換行符 |
\cA : \cZ | 控制符,例如\cM 匹配一個ctrl+m |
\x0000 : \xFFFF | 十六進制的Unicode碼 |
\x00 : \xFF | 十六進制ASCII碼 |
下面,咱們按照上面的表格來分別寫一個小 Demogithub
除了空格和換行符之外的全部字符 eg:正則表達式
var reg = /./g var str = 'x' var str2 = 123 var str3 = ' ' var str4 = '\n' var str5 = '\r' var res = reg.test(str) // true var res2 = reg.test(str2) // true var res3 = reg.test(str3) // false var res4 = reg.test(str4) // false var res5 = reg.test(str5) // false
匹配空白字符 (space) eg:es5
var reg = /\s/g var str = 'x' var str2 = ' ' var str3 = '\n' var str4 = '\r' var str5 = '\r\n' var res = reg.test(str) // false var res2 = reg.test(str2) // true var res3 = reg.test(str3) // false var res4 = reg.test(str4) // true var res5 = reg.test(str5) // true // 又疑惑了 🤔??? // 沒法解釋? n 表明 newLine 新行, r 表明 return 換行 // 只能這麼解釋了,newline 是由於這一行寫滿了沒有空白了, return 是強行換行,因此必定是有空白的。
匹配非空白字符 (Space) eg:spa
var reg = /\S/g var str = 'x' var str2 = ' ' var res = reg.test(str) // true var res2 = reg.test(str2) // false
匹配能夠構成單詞的字符 (world)( 匹配字母、數字、下劃線 ) eg:code
var reg = /\w/g var str = 'age' var str2 = 'a1ge' var str3 = 'a ge' var str4 = 'a&ge' var str5 = 123 var res = reg.test(str) // true var res2 = reg.test(str2) // true var res3 = reg.test(str3) // true var res4 = reg.test(str4) // true var res5 = reg.test(str5) // false var arr = [res,res2,res3,res4,res5] for(let i = 0; i<arr.length; i++) { console.log(arr[i]) }
匹配不能夠構成單詞的字符 (World) eg:blog
var reg = /\W/g var str = 'age' var str2 = 'a1ge' var str3 = 'a ge' var str4 = 'a&ge' var str5 = 123 var res = reg.test(str) // false var res2 = reg.test(str2) // false var res3 = reg.test(str3) // true var res4 = reg.test(str4) // false var res5 = reg.test(str5) // false var arr = [res,res2,res3,res4,res5] for(let i = 0; i<arr.length; i++) { console.log(arr[i]) } // 有疑惑 🤔 爲啥呢? // str3 中出現了空格 確實不能組成單詞
匹配 數字( digit ) eg:
var reg = /\d/g var str = 123 var str2 = 'xxx' var res = reg.test(str) // true var res2 = reg.test(str2) // false
匹配 非數字( Digit ) eg:
var reg = /\D/g var str = 123 var str2 = 'xxx' var res = reg.test(str) // false var res2 = reg.test(str2) // true
匹配 單詞的邊界( boundary )( 字母、數字、下劃線 ) eg:
var reg = /\b/g var str = 123 var str2 = '@' var str3 = '_' var str4 = '&' var str5 = 'xxx' var res = reg.test(str) // true var res2 = reg.test(str2) // false var res3 = reg.test(str3) // true var res4 = reg.test(str4) // false var res5 = reg.test(str5) // true
匹配 非單詞的邊界( Boundary ) eg:
var reg = /\B/g var str = 123 var str2 = '@' var str3 = '_' var str4 = '&' var str5 = 'xxx' var res = reg.test(str) // true var res2 = reg.test(str2) // true var res3 = reg.test(str3) // false var res4 = reg.test(str4) // true var res5 = reg.test(str5) // true
若是想將操做符應用於一組字符串,可使用(),這就是分組的概念。
例如(ab)+
匹配的就是一個或多個字符串ab
當用括號進行分組時,也建立了所謂的捕獲(capture)
咱們仍是來舉例子來講明:
eg:
// demo-1 var reg = /(ab)+/g var str = 'bababababbababababaaabbb' var res = str.match(reg) // ["abababab", "abababab", "ab"] // demo-2 var reg = /(ab)/g var str = 'bababababbababababaaabbb' var res = str.match(reg) // ["ab", "ab", "ab", "ab", "ab", "ab", "ab", "ab", "ab"]
貪婪匹配了 連續符合 ab * n 規則的字符串
用|表示或者的關係,例如a|b表示匹配a或b字符
eg:
// demo var reg = /a|b/g var str = 'abcd' var str2 = 'aabbccdd' var res = str.match(reg) // ["a", "b"] var res2 = str2.match(reg) // ["a", "a", "b", "b"]
正則表達式中所定義的捕獲的反向引用指的是
將捕獲做爲正則表達式中可以成功匹配術語時的候選字符串
這種術語表示法是在反斜杆後面加一個要引用的捕獲數量。
eg:
var str = '<p>1</p>' var str2 = '<strong>2</strong>' var reg = /<(\w+)>(.+)<\/\1>/ var res = str.match(reg) var res2 = str2.match(reg)
仍是有疑惑? 🤔 爲何呢?
每每一個定義沒法被理解的話,就只能 換中理解方式來理解這些理解不了的。
另一種 特殊解釋:
捕獲組捕獲到的內容,不只能夠在正則表達式外部經過程序進行引用,也能夠在正則表達式內部進行引用,這種引用方式就是反向引用。
又有一個問題:捕獲組
是什麼意思?
什麼是捕獲組?
捕獲組就是把正則表達式中子表達式匹配的內容
,保存到內存中以數字編號
或顯式命名
的組裏,方便後面引用。固然,這種引用既能夠是在正則表達式內部,也能夠是在正則表達式外部。
捕獲組有兩種形式,一種是普通捕獲組,另外一種是命名捕獲組,一般所說的捕獲組指的是普通捕獲組。語法以下:
普通捕獲組:
(Expression)
命名捕獲組:
(?<name>Expression)
Demo -1 普通捕獲組 :
var str = "2018-08-30" var generalReg = /(\d{4})-(\d{2})-(\d\d)/g var res = str.match(generalReg) // ["2018-08-30"]
上面的 例子當中 表達式中就很明確的 捕獲組、編號等
編號 | 命名 | 捕獲組 | 匹配內容 |
---|---|---|---|
0 | (\d{4})-(\d{2})-(\d\d)) | 2018-08-30 | |
1 | (\d{4}) | 2018 | |
2 | (\d{2}) | 08 | |
3 | (\d\d) | 30 |
Demo -2 命名捕獲組 :
var str = "2018-08-30" var generalReg = /(?<year>\d{4})-(?<date>\d{2})-(?<day>\d\d)/g var res = str.match(generalReg) // ["2018-08-30"]
上面的 例子當中 表達式中就很明確的 捕獲組、編號等
編號 | 命名 | 捕獲組 | 匹配內容 |
---|---|---|---|
0 | (\d{4})-(\d{2})-(\d\d)) | 2018-08-30 | |
1 | year | (\d{4}) | 2018 |
2 | date | (\d{2}) | 08 |
3 | day | (\d\d) | 30 |
正則表達式中,對前面捕獲組捕獲的內容進行引用,稱爲反向引用;
咱們結合上面講到的內容再進行一個 Demo :
var str = 'abcdebbcde' var reg = /([ab])/g var res = reg.test(str) // true var res0 = str.match(reg) // ['bb'] var reg2 = /([ab])\2/g var res2 = reg2.test(str) // false var res3 = str.match(reg2) // null var strs = 'abcdbaabbccde' var reg3 = /([ab])([a])\2/g var res3 = reg3.test(strs) var res4 = strs.match(reg3) // ["baa"]
再來一次Demo
var str = '<div><p>1</p><strong>2</strong><div>' var reg = /<(\w+)>(.+)<(\/\1)>?/g var res = str.match(reg) // ["<p>1</p>", "<strong>2</strong>"]
這裏對於反向引用是否是又多了一份理解咧~
反向引用
在實際的使用場景仍是比較多,並且也是一個比較重要的概念,但願能深度感覺。
今日份關於正則表達式的介紹就先到這裏了,深圳最近幾天都是暴雨,下班回家咯~記得要帶傘噢
GitHub 地址:(歡迎 star 、歡迎推薦 : )