深入学习正则表达式

1.捕获与引用

被正则表达式匹配(捕获)到的字符串会被暂存起来。其中,由分组捕获的串会从1开始编号,于是我们可以引用这些串:

var reg = /(\d{4})-(\d{2})-(\d{2})/
var date = '2021-08-29'
reg.test(date)
// 捕获之前要先test/exec
console.log(RegExp.$1); //2021
console.log(RegExp.$2); //08
console.log(RegExp.$3); //29

$1引用了第一个被捕获的字符串,$2是第二个,依次类推。

1.1嵌套分组的捕获

//遇到嵌套的分组是捕获的顺序
var reg = /((apple) is (a (fruit)))/
var str = "apple is a fruit"
reg.test(str) // true
RegExp.$1 // apple is a fruit
RegExp.$2 // apple
RegExp.$3 // a fruit
RegExp.$4 // fruit
//由结果可知:捕获的规则从左至右,以左括号'('出现的顺序进行捕获

1.2引用

正则表达式里的引用称为反向引用

var reg = /(\w{3}) is \1/; 
console.log(reg.test('kid is kid')); // true
console.log(reg.test('dik is dik')); // true
console.log(reg.test('kid is dik')); // false
console.log(reg.test('dik is kid')); // false
//这里'\1'引用了第一个被分组捕获的字符串,由此可看出表达式是动态决定的

// '\1'编号不能越界,否则会被当做普通的字符串
var reg = /(\w{3}) is \6/;
reg.test( 'kid is kid' ); // false
reg.test( 'kid is \6' );  // true

2.String对正则表达式的支持

(1)search

作用:查找字符串中是否有匹配正则的字符串,有则返回字符串第一次出现时的位置的下标,没有则返回null。

注意:正则中无论是否有全局匹配都不会影响返回的结果

var str = 'hello world hello';
var reg = /hello/;
var reg2 = /hello/g;
console.log(str.search(reg)); //返回 0
console.log(str.search(reg2));//返回 0

(2)match

作用:匹配字符串中符合正则表达式的字符串,并返回该字符串的一个数组,其中包括字符串的内容、位置。

注意:如果正则设置全局匹配,则一次性返回所有符合正则表达式的字符串数组

var str = 'hello world hello';
var reg1 = /hello/;
var reg2 = /hello/g;
console.log(str.match(reg1));
// 返回该字符串的一个数组,其中包括正则表达式、检测的字符串内容、第一个匹配的位置
// [ 'hello', index: 0, input: 'hello world hello', groups: undefined ]
console.log(str.match(reg2));
// 如果正则设置全局匹配,则一次性返回所有符合正则表达式的字符串数组
// [ 'hello', 'hello' ]

如果其中添加了分组,返回符合要求的字符串以及分组的一个数组,但如果同时开启全局匹配则不会在数组中添加分组内容。

var str = 'hello world hello';
var reg1 = /(he)llo/;
var reg2 = /(he)llo/g;
console.log(str.match(reg1));
// 只添加了分组,返回符合要求的字符串以及分组的一个数组
// [
//   'hello',
//   'he',
//   index: 0,
//   input: 'hello world hello',
//   groups: undefined
// ]
console.log(str.match(reg2));
// 添加分组同时开启全局匹配则 不会在数组中添加分组内容
// [ 'hello', 'hello' ]

(3)split

作用:某种特定的形式分割字符串

var str = "terry134briup156lisi12zhangsan";
var reg = /\d+/;// 当数字出现一次或多次时
var result = str.split(reg);// 以匹配正则表达式的字符串进行分割
console.log(result); // [ 'terry', 'briup', 'lisi', 'zhangsan' ]

(4)replace

作用:替换满足正则表达式条件的内容

var str = 'javascript'
// 如果开启全局模式 则替换所有满足条件的字符
var reg = /javascript/;
// replace(正则表达式, 要替换的内容)
var result = str.replace(reg, 'java');
console.log(result); //java
console.log(str); //javascript

3.前瞻表达式

表达式:?=exp(正向前瞻)     ?!exp(负向前瞻)

作用:正向前瞻,匹配后面满足表达式exp的位置。负向前瞻,匹配后面不满足表达式exp的位置。

正向前瞻:

var str = 'Hello, Hi, I am Hilary.';
// 后面一定要匹配什么
var reg = /H(?=i)/g;// 这里表示必须满足H后面紧挨着i
var newStr = str.replace(reg, "T");// 只要满足上面的条件的H,将被替换成T
console.log(newStr);//Hello, Ti, I am Tilary.

负向前瞻:

var str = 'Hello, Hi, I am Hilary.';
// 后面一定不要匹配什么
var reg = /H(?!i)/g; //H后面一定不能是i
var newStr = str.replace(reg, "T");// H后面不是紧挨着i的满足,满足的H将被替换为T
console.log(newStr);//Tello, Hi, I am Hilary.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值