欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

正则的扩展

程序员文章站 2022-07-02 17:03:06
1.RegExp构造函数 ES5中有两种情况 注意!!! ES6的改变 2.字符串的正则方法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串 search() 方法用于检 ......

1.regexp构造函数

es5中有两种情况
let regex = new regexp('xyz', 'i')
// 等价于
let regex = /xyz/i

let regex = new regexp(/xyz/i)
// 等价于
let regex = /xyz/i

注意!!!

let regex = new regexp(/xyz/, 'i')
// 这种写法是错误的
es6的改变
new regexp(/abc/ig, 'i').flags
// 第二个参数i会将前面的ig进行覆盖

2.字符串的正则方法

  • match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
let str="1 plus 2 equal 3"
str.match(/\d+/g)
// ['1','2','3']
  • replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串
let str = 'nihao jack'
str.replace(/jack/, 'lucy')
// nihao lucy
  • search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
let str = 'good body'
str.search(/body/)
// 5

let str = 'good body'
str.search(/girl/)
// -1
  • split() 方法用于把一个字符串分割成字符串数组
let str = 'good body'
str.split('o')
["g", "", "d b", "dy"]

3.u修饰符

  • es6 对正则表达式添加了u修饰符,含义为“unicode 模式”,用来正确处理大于\uffff的 unicode 字符。也就是说,会正确处理四个字节的 utf-16 编码。

4.regexp.prototype.unicode 属性

  • 正则实例对象新增unicode属性,表示是否设置了u修饰符
let str = /hello/;
let str2 = /hello/u;

str.unicode // false
str2.unicode // true

5.y修饰符

  • y修饰符,叫做“粘连”(sticky)修饰符。
  • y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
let str = 'aaa_aa_a'
let reg1 = /a+/g
let reg2 = /a+/y

reg1.exec(s) // ['aaa']
reg2.exec(s) // ['aaa']

reg1.exec(s) // ['aa']
reg2.exec(s) // null y修饰符从剩余项的第一个位置开始(即_)所以找不到

lastindex属性可以指定每次搜索的开始位置

reg2.lastsindex = 1
reg2.exec(s) // ['aa']

实际上y修饰符号隐含了头部匹配的标志^
  • 单单一个y修饰符对match方法,只能返回第一个匹配,必须与g修饰符联用,才能返回所有匹配。
'a1a2a3'.match(/a\d/y) // ['a1']
'a1a2a3'.match(/a\d/gy) // ['a1','a2','a3']

6.regexp.prototype.sticky 属性

  • 表示是否设置了y修饰符

7.regexp.prototype.flags 属性

  • 会返回正则表达式的修饰符

8.s 修饰符:dotall 模式

9.后行断言

10.unicode 属性类

11.具名组匹配

  • 正则表达式使用圆括号进行组匹配
const reg = /(\d{4})-(\d{2})-(\d{2})/

const matchobj = reg.exec('1999-12-31')
const year = matchobj[1]; // 1999
const month = matchobj[2]; // 12
const day = matchobj[3]; // 31

问题: 只能用数字序号引用,组的顺序改变,引用的时候就必须修改序号

  • 具名组匹配,允许为每一个组匹配指定一个名字,既便于阅读代码,又便于引用
const reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/

const matchobj = reg.exec('1999-12-31')
const year = matchobj.groups.year // 1999
const month = matchobj.groups.month // 12
const day = matchobj.groups.day // 31

如果具名组没有匹配,那么对应的groups对象属性会是undefined

12.解构赋值和替换

  • 有了具名组匹配以后,可以使用解构赋值直接从匹配结果上为变量赋值
let {groups: {one, two}} = /^(?<one>.*):(?<two>.*)$/u.exec('foo:bar')

console.log({one, two}) // {one: 'foo', two: 'bar'}