正则表达式

正则表达式[\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)除外。

如下四个字符属于”行终止符“。

  • U+000A 换行符(\n
  • U+000D 回车符(\r
  • U+2028 行分隔符(line separator)
  • U+2029 段分隔符(paragraph separator)
/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不冲突,二者一块儿使用的状况下,.匹配全部字符,而^$匹配每一行的行首和行尾。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息