dotAll(點匹配)數組
named captured groups(命名分組捕獲)學習
ES5spa
loodbehind assert(後行斷言)code
正則中的點就是dotAll
,都是匹配任意字符,可是不少字符是沒法匹配的。例如:blog
UTF-16
的字符\\n
\\r
換行 回車console.log(/foo.bar/.test('foo\nbar')) //false console.log(/foo.bar/.test('fooabar')) // true
加上s
能夠匹配換行符rem
console.log(/foo.bar/s.test('foo\nbar')) // true
加上s
能夠匹配換行符,加上u
就能夠匹配4位的UTF-16
字符,點的功能就全能了字符串
console.log(/foo.bar/us.test('foo\nbar'))
使用flags
屬性判斷,若是沒有開啓就是false
input
const r = /foo.bar/ console.log(r.dotAll) // false console.log(r.flags) // 空 const re = /foo.bar/s console.log(re.dotAll) // true console.log(re.flags) // s
以前分組捕獲有,可是命名的分組捕獲剛有it
如何取到字符串中匹配的年月日?console
// 先看一下match匹配出來的值有哪些? console.log("2019-06-07".match(/(\d{4})-(\d{2})-(\d{2})/)) // ["2019-06-07", "2019-06-07", "2019", "06", "07", index: 0, input: "2019-06-07", groups: undefined] // 完整匹配 // 第一個括號分組 // 第二個括號分組 // 第三個括號分組 // index 從第幾個字符開始匹配到的 // input 完整的輸入字符串 // groups 目前位空,一會就知道用法了 const t = "2019-06-07".match(/(\d{4})-(\d{2})-(\d{2})/) console.log(t[1]) //2019 console.log(t[2]) //06 console.log(t[3]) //07
上面的方法,若是數據複雜的時候很差寫,何況數組還要數第幾個,那麼加一個名字會比較好
// 在括號裏面寫 ?<命名key> const T = "2019-06-07".match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/) console.log(T) // ["2019-06-07", "2019", "06", "07", index: 0, input: "2019-06-07", // groups: {day: "07", month: "06", year: "2019"}] // 這個時候groups裏面有值了,並且用命名的key能夠取到 console.log(T.groups.year) //2019 console.log(T.groups.month) //06 console.log(T.groups.day) //07
先行斷言都有,ES9
剛有的後行斷言
js
一直是先行斷言的
let test = 'hello world' console.log(test.match(/hello(?=\sworld)/)) // 後面的括號不是分組匹配,是先行斷言 // 先遇到一個條件
可是我要知道world
以前的那個是hello
,就是後行斷言
ES9
這個能力補齊了
console.log(test.match(/(?<=hello\s)world/)) // (?<=hello\s) 是判斷world前面是hello加空格 console.log(test.match(/(?<!hell2\s)world/)) // ! 表示不等於 // \1表示捕獲匹配