JavaScript正则表达式(一)-- RegExp特性

JavaScript正则表达式

语法:
let expresion = /pattern/flags;

pattern:可以使任何的正则表达式。 每个表达式可以带0或多个flags。

flag取值:

  • g:全局模式。表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。
  • i:不区分大小写。表示在查找匹配时忽略 pattern 和字符串的大小写。
  • m:多行模式。表示查找到一行文本末尾时会继续查找。
  • y:粘附模式。表示只查找从lastIndex开始及之后的字符串。
  • u:Unicode模式。启用 Unicode 匹配。
  • s:dotAll模式。表示元字符.匹配任何字符(包括\n 或\r)。

举个🌰:

// 匹配字符串中的所有"at" 
let pattern1 = /at/g; 
// 匹配第一个"bat"或"cat",忽略大小写
let pattern2 = /[bc]at/i; 
// 匹配所有以"at"结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;

!模式中所有元字符都必须转义,包括 ( [ { \ ^ $ | ) ] } ? * + .

举个🌰:

// 匹配第一个"bat"或"cat",忽略大小写
let pattern1 = /[bc]at/i; 
// 匹配第一个"[bc]at",忽略大小写
let pattern2 = /\[bc\]at/i; 
// 匹配所有以"at"结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi; 
// 匹配所有".at",忽略大小写
let pattern4 = /\.at/gi;

上面的正则表达式都是用字面量定义的,正则也可以使用RegExp构造函数来构造,有两个参数:(模式字符串, 标记字符串(可选))
举个🌰:

//字面量:
let pattern1 = /[bc]at/i;
//构造函数
let pattern2 = new RegExp('[bc]at', 'i');

!因为new RegExp模式参数是字符串,所以元字符需要进行二次转义,包括转义字符序列,如\n => \\n

在这里插入图片描述

RegExp实例方法
exec()

exec(),主要用于配合捕获组使用,参数只有一个: exec(要应用模式的字符串),如果没有匹配项,返回null。返回的数组虽然是 Array 的实例,但包含两个额外的属性:index 和 input。index 是字符串中匹配模式的起始位置,input 是要查找的字符串。
🌰:
在这里插入图片描述
上面的🌰中,模式包含两个捕获组:内部匹配项 “and baby“和外部匹配项”and dad“或”and dad and baby”。调用 exec()后找到了一个匹配项。因为整个字符串匹配模式,所以 matchs数组的 index 属性就是 0。
数组的第一个元素是匹配的整个字符串;第二个元素是匹配第一个捕获组的字符串;第三个元素是匹配第二个捕获组的字符串。
如果模式设置了全局标记,则每次调用 exec()方法会返回一个匹配的信息。如果没有设置全局标记,则无论对同一个字符串调用多少次 exec(),也只会返回第一个匹配的信息。

如果模式设置了全局标记,则每次调用 exec()方法会返回一个匹配的信息。如果没有设置全局标记,则无论对同一个字符串调用多少次 exec(),也只会返回第一个匹配的信息。

🌰:

let text = "cat, bat, sat, fat"; 
let pattern = /.at/; 
let matches = pattern.exec(text); 
console.log(matches.index); // 0 
console.log(matches[0]); // cat 
console.log(pattern.lastIndex); // 0 
matches = pattern.exec(text); 
console.log(matches.index); // 0 
console.log(matches[0]); // cat 
console.log(pattern.lastIndex); // 0

上面例子中的模式没有设置全局标记,因此调用
exec()只返回第一个匹配项(“cat”)。lastIndex在非全局模式下始终不变。 如果在这个模式上设置了 g 标记,则每次调用
exec()都会在字符串中向前搜索下一个匹配项,如下面的🌰所示:

let text = "cat, bat, sat, fat"; 
let pattern = /.at/g; 
let matches = pattern.exec(text); 
console.log(matches.index); // 0 
console.log(matches[0]); // cat 
console.log(pattern.lastIndex); // 3 
matches = pattern.exec(text); 
console.log(matches.index); // 5 
console.log(matches[0]); // bat 
console.log(pattern.lastIndex); // 8 
matches = pattern.exec(text); 
console.log(matches.index); // 10 
console.log(matches[0]); // sat 
console.log(pattern.lastIndex); // 13

这次模式设置了全局标记,因此每次调用
exec()都会返回字符串中的下一个匹配项,直到搜索到字符串末尾。注意模式的 lastIndex
属性每次都会变化。在全局匹配模式下,每次调用 exec()都会更新 lastIndex 值,以反映上次匹配的最后一个字符的索引。

test()

test方法接收一个字符串参数,如果输入的文本与模式匹配,则参数返回true,否则返回 false。这个方法适用于只想测试模式是否匹配,而不需要实际匹配内容的情况。test()经常用在 if 语句中.
🌰:
在这里插入图片描述

RegExp构造函数属性

RegExp构造函数本身也有几个属性。
在这里插入图片描述
🌰:

let text = "this has been a short summer"; 
let pattern = /(.)hort/g;   //匹配任何后跟"hort"的字符
if (pattern.test(text)) { 
 console.log(RegExp.input); // this has been a short summer 
 console.log(RegExp.leftContext); // this has been a 
 console.log(RegExp.rightContext); // summer 
 console.log(RegExp.lastMatch); // short 
 console.log(RegExp.lastParen); // s 
}

这些属性名也可以替换成简写形式,只不过要使用中括号语法来访问,如下面的例子所示,因为大多数简写形式都不是合法的 ECMAScript 标识符:

console.log(RegExp["$`"]);    // this has been a
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值