正则表达式详解

正则表达式

JavaScript 中,正则表达式通过内建的 RegExp 类的对象来实现,并与字符串集成

正则表达式是用于匹配字符串中字符组合的模式,在 JavaScript 中,正则表达式也是对象

这些模式被用于 RegExpexectest 方法, 以及 StringmatchmatchAllreplacesearchsplit 方法

1. 正则创建与属性

创建一个正则表达式对象有两种语法

  • 字面量创建
  • 对象创建

1-1 字面量创建

使用一个正则表达式字面量,其由包含在斜杠之间 /.../ 的模式组成

使用 /.../ 包裹的字面量创建方式是推荐的作法,但它不能在其中使用变量

let regexp = /pattern/; // 没有修饰符
let regexp = /pattern/flags; // 伴随修饰符 g、m 和 i

1-2 对象创建

简短语法 /.../,它不接受任何变量插入

new RegExp 允许从字符串中动态地构造模式

我们可以找出需要搜索的字段,然后根据搜索字段创建 new RegExp

let regexp = new RegExp("pattern", "flags");

let str = 'I will keep working hard'
let regexp1 = new RegExp("will", 'i')
let regexp1 = new RegExp(/will/, 'i')
console.log(str.search(regexp1)); // 2

1-3 lastIndex 属性

lastIndex 是正则表达式的一个可读可写的整型属性,用来指定下一次匹配的起始索引

只有正则表达式使用了表示全局模式检索的 g 标志时,该属性才会起作用

  • 如果 lastIndex 大于字符串的长度,则 regexp.testregexp.exec 将会匹配失败,然后 lastIndex 被设置为 0
  • 如果 lastIndex 等于字符串的长度,且该正则表达式匹配空字符串,则该正则表达式匹配从 lastIndex 开始的字符串
  • 如果 lastIndex 等于字符串的长度,且该正则表达式不匹配空字符串 ,则该正则表达式不匹配字符串,lastIndex 被设置为 0
  • 否则 lastIndex 被设置为紧随最近一次成功匹配的下一个位置
lastIndex = regExpObj.lastIndex;

// lastIndex属性 当全局模式g下才能起作用
// 下一次匹配的起始索引
let next = 'hello world';
let regexp1 = /l/g;
console.log(regexp1.test(next)); // true
console.log(regexp1.lastIndex); // 3

// lastIndex > 字符串长度 匹配失败 lastIndex重置为0
regexp1.lastIndex = 20;
console.log(regexp1.test(next)); // false
console.log(regexp1.lastIndex); // 0

// lastIndex = 字符串长度 匹配空字符串 从lastIdnex开始
let reg = /\s/g;
reg.lastIndex = 1;
console.log(reg.test(next)); // true
console.log(reg.lastIndex); // 6

// lastIndex = 字符串长度 不匹配空字符串 重置为0
let reg1 = /\S/g;
reg1.lastIndex = next.length;
console.log(reg1.test(next)); // false
console.log(reg1.lastIndex); // 0

1-4 转义字符

/.../ 转义

把特殊字符作为常规字符来使用,只需要在它前面加个反斜杠 \

这里是包含所有特殊字符的列表:[ \ ^ $ . | ? * + ( )

  • /.../ 中把特殊字符作为常规字符来使用 [ \ ^ $ . | ? * + ( ) 时需要转义

  • 斜杠符号 '/' 并不是一个特殊符号,但是它被用于在 Javascript 中开启和关闭正则匹配,所有需要转义

// regexp转义 通过反斜线即可将特殊字符转义
let str = "jsx.ljj";
// 通过\. 将.特殊字符转义
console.log(str.match(/\w\.\w/g)); // ['x.l']

console.log('function go(){}'.match(/go\(\)/g)); // ['go()']
// 当需要一个反斜杠时,可使用两个反斜杠转义
console.log('as\\d'.match(/\\/g)); // ['\\']

new RegExp() 转义

  • 使用 new RegExp() 创建正则时,传入字符串匹配以字符串转义规则,在字符串中的反斜杠表示转义,所以调用 new RegExp 会获得一个没有反斜杠的字符串
// 斜杠/ 用来关闭开启正则,如果需要匹配斜杠需要转义
console.log('/'.match(/\//g)); // ['/']

// 在new RegExp中/ 不需要转义
console.log('/'.match(new RegExp('/', 'g'))) // ['/']

// new RegExp 传入的是字符串匹配,按照字符串转义
let str1 = '\\d\.\\d';
console.log('asd5.0'.match(new RegExp(str1, 'g'))); // ['5.0']

2. 模式修饰符

正则表达式有六个可选参数 (flags) 允许全局和不分大小写搜索等

这些参数既可以单独使用也能以任意顺序一起使用, 并且被包含在正则表达式实例中

  • i:搜索时不区分大小写: Aa 没有区别
  • g:全局搜索模式,搜索时会查找所有的匹配项,而不只是第一个
  • m:多行模式
  • s:启用 dotall 模式,允许点 . 匹配换行符 \n
  • u:开启完整的 unicode 支持
  • y:粘性模式

2-1 i 大小写模式

搜索时不区分大小写: Aa 没有区别

let str = 'I will keep working hard';
console.log(str.search(/KEEP/g)); // -1
console.log(str.search(/KEEP/ig)); // 7
  • 第一个搜索返回的是 -1(也就是没找到),因为搜索默认是区分大小写的
  • 使用修饰符 /KEEP/i,在字符串的第 7 个位置上搜索到了 keep

2-2 g 全局模式

全局搜索模式,搜索时会查找所有的匹配项,而不只是第一个

let str1= 'I will keep working hard KEEP';
console.log(str1.match(/KEEP/ig)); // ['keep', 'KEEP']
  • match 方法,如果 regexp 带有 g 修饰符,则它将所有匹配项的数组作为字符串返回

  • 使用 /KEEP/ig 匹配全局无论大小写的 keep

2-3 m 多行模式

通过 /.../m 开启多行模式,在多行模式下 ^$ 会匹配每一行的开始与结束

let str3 = `1st name: JSX
2st name: LJJ
3st nameL DDC`
console.log(str3.match(/\w+$/gim)); // ['JSX', 'LJJ', 'DDC']
// 在多行模式下 ^ 和 $ 会匹配每一行的开始与结束
console.log(str3.match(/^\d+/gm)); // ['1', '2', '3']

也可以通过换行符 \n ,但是换行符 \n 不会匹配字符串结尾,会匹配 \n 字符类返回

let str3 = `1st name: JSX
2st name: LJJ
3st nameL DDC`
console.log(str3.match(/\w+\n/gim)); // ['JSX\n', 'LJJ\n']

2-4 s dotall 模式

s修饰符开启 dotAll 模式,使得. 点字符可以匹配任意单个字符

正则表达式还引入了一个dotAll属性,返回一个布尔值,表示该正则表达式是否处在dotAll模式

let str4 = '12436>:{">{~!@(\n';
console.log(str4.match(/./sg));
// ['1', '2', '4', '3', '6', '>', ':', '{', '"', '>', '{', '~', '!', '@', '(', '\n']
// dotAll属性 检测是否处于dotAll模式
console.log(/./sg.dotAll); // true

2-5 u Unicode 模式

修饰符 u 在正则表达式中提供对 Unicode 的支持

unicode\p{Ll} 转义字符加标点符号 p 相等于匹配所有字母

  • 4 个字节长的字符被以正确的方式处理:被看成单个的字符,而不是 2 个 2 字节长的字符
  • Unicode 属性可以被用于查找中
\p{
   Unicode属性值}
let str3 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值