正则表达式[\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
不冲突,二者一块儿使用的状况下,.
匹配全部字符,而^
和$
匹配每一行的行首和行尾。