正則表達式[\w]+,\w+,[\w+] 三者有何區別:
[\w]+和\w+沒有區別,都是匹配數字和字母下劃線的多個字符;
[\w+]表示匹配數字、字母、下劃線和加號自己字符;
git
[]github
表示數組而非排列,即不按固定次序位置排列;
在[]內的字符能夠任意次序出現。
[ABC]+
能夠匹配"AAABBBCCC,BBBAAACCC,BACCBACAACBAC,...",不是必定按固定A....B....C...的次序排列。
[\w./-+]+正則表達式
是匹配\w [0-9a-zA-Z_] 或 . 或 / 或 - 或 + 字符;數組
在[./-+]內均表示字符自己;函數
在[]+外表示{1,}至少1次或屢次;編碼
在[.]內點,不是任意字符的意思,就是匹配點.字符自己,點.能夠不須要加反斜槓\.。spa
在[]內特殊字符,表示匹配特殊字符自己,不須要加反斜槓,code
在[]外特殊字符,表示匹配特殊字符自己,必需要加反斜槓。regexp
ES6新增正則表達式字符對象
(1)點字符
點(.
)字符在正則表達式中,含義是除了換行符之外的任意單個字符。對於碼點大於0xFFFF
的 Unicode 字符,點字符不能識別,必須加上u
修飾符。
var s = '𠮷'; /^.$/.test(s) // false /^.$/u.test(s) // true
上面代碼表示,若是不添加u
修飾符,正則表達式就會認爲字符串爲兩個字符,從而匹配失敗。
(2)Unicode 字符表示法
ES6 新增了使用大括號表示 Unicode 字符,這種表示法在正則表達式中必須加上u
修飾符,才能識別當中的大括號,不然會被解讀爲量詞。
/\u{61}/.test('a') // false /\u{61}/u.test('a') // true /\u{20BB7}/u.test('𠮷') // true
上面代碼表示,若是不加u
修飾符,正則表達式沒法識別\u{61}
這種表示法,只會認爲這匹配61個連續的u
。
(3)量詞
使用u
修飾符後,全部量詞都會正確識別碼點大於0xFFFF
的 Unicode 字符。
/a{2}/.test('aa') // true /a{2}/u.test('aa') // true /𠮷{2}/.test('𠮷𠮷') // false /𠮷{2}/u.test('𠮷𠮷') // true
(4)預約義模式
u
修飾符也影響到預約義模式,可否正確識別碼點大於0xFFFF
的 Unicode 字符。
/^\S$/.test('𠮷') // false /^\S$/u.test('𠮷') // true
上面代碼的\S
是預約義模式,匹配全部不是空格的字符。只有加了u
修飾符,它才能正確匹配碼點大於0xFFFF
的 Unicode 字符。
利用這一點,能夠寫出一個正確返回字符串長度的函數。
function codePointLength(text) { var result = text.match(/[\s\S]/gu); return result ? result.length : 0; } var s = '𠮷𠮷'; s.length // 4 codePointLength(s) // 2
(5)i 修飾符
有些 Unicode 字符的編碼不一樣,可是字型很相近,好比,\u004B
與\u212A
都是大寫的K
。
/[a-z]/i.test('\u212A') // false /[a-z]/iu.test('\u212A') // true
上面代碼中,不加u
修飾符,就沒法識別非規範的K
字符。
(6)y 修飾符
y
修飾符的做用與g
修飾符相似,也是全局匹配,後一次匹配都從上一次匹配成功的下一個位置開始。不一樣之處在於,g
修飾符只要剩餘位置中存在匹配就可,而y
修飾符確保匹配必須從剩餘的第一個位置開始,這也就是「粘連」的涵義。
var s = 'aaa_aa_a'; var r1 = /a+/g; var r2 = /a+/y; r1.exec(s) // ["aaa"] r2.exec(s) // ["aaa"] r1.exec(s) // ["aa"] r2.exec(s) // null
(7)sticky屬性
與y
修飾符相匹配,ES6 的正則對象多了sticky
屬性,表示是否設置了y
修飾符。
var r = /hello\d/y; r.sticky // true
(7)flags屬性
ES6 爲正則表達式新增了flags
屬性,會返回正則表達式的修飾符。
// ES5 的 source 屬性 // 返回正則表達式的正文 /abc/ig.source // "abc" // ES6 的 flags 屬性 // 返回正則表達式的修飾符 /abc/ig.flags // 'gi'
(7)s修飾符:dotAll模式
正則表達式中,點(.
)是一個特殊字符,表明任意的單個字符,可是行終止符(line terminator character)除外。
如下四個字符屬於」行終止符「。
\n
)\r
)/foo.bar/.test('foo\nbar') // false
上面代碼中,由於.
不匹配\n
,因此正則表達式返回false
。
可是,不少時候咱們但願匹配的是任意單個字符,這時有一種變通的寫法。
/foo[^]bar/.test('foo\nbar') // true
這種解決方案畢竟不太符合直覺,因此如今有一個提案,引入/s
修飾符,使得.
能夠匹配任意單個字符。
/foo.bar/s.test('foo\nbar') // true
這被稱爲dotAll
模式,即點(dot)表明一切字符。因此,正則表達式還引入了一個dotAll
屬性,返回一個布爾值,表示該正則表達式是否處在dotAll
模式。
const re = /foo.bar/s; // 另外一種寫法 // const re = new RegExp('foo.bar', 's'); re.test('foo\nbar') // true re.dotAll // true re.flags // 's'
/s
修飾符和多行修飾符/m
不衝突,二者一塊兒使用的狀況下,.
匹配全部字符,而^
和$
匹配每一行的行首和行尾。