lastIndex 属性(正则表达式)
描述
指定索引,下一个匹配从该索引处开始。
语法
rgexp.lastIndex [= index]
lastIndex 属性的语法组成部分如下:
| 部分 | 描述 |
|---|---|
| rgexp | 必选项。正则表达式 对象。可以是变量名或文字。 |
| index | 索引,下一个匹配从该索引处开始。 |
说明
lastIndex 属性被 exec 方法、以及 String 对象的 match、replace、和 split 方法修改。
只有正则表达式使用了表示全局检索的 “g” 标志时,该属性才会起作用。此时应用下面的规则:
-
如果
lastIndex大于字符串的长度,则regexp.test和regexp.exec将会匹配失败,然后lastIndex被设置为 0。 -
如果
lastIndex等于字符串的长度,且该正则表达式匹配空字符串,则该正则表达式匹配从lastIndex开始的字符串。(then the regular expression matches input starting atlastIndex.)
如果lastIndex等于字符串的长度,且该正则表达式不匹配空字符串 ,则该正则表达式不匹配字符串,lastIndex被设置为0.。 -
否则,
lastIndex被设置为紧随最近一次成功匹配的下一个位置。
source 属性
描述
返回正则表达式模式的文本的复本。只读。
语法
rgexp.source
rgexp 参数是正则对象。它可以是变量名或文字。
下面的例子举例说明了 source 属性的用法:
function SourceDemo(re, s)
{
var s1;
// 测试字符串中是否存在正则表达式。
if (re.test(s))
s1 = " contains ";
else
s1 = " does not contain ";
// 获得正则表达式自己的文本。
return(s + s1 + re.source);
}
常用匹配
获取两个字符之间的内容
- 获取某个字符之前的字符串:
str.match(/(\S*)a/)[1] - 获取某个字符之后的字符串:
str.match(/a(\S*)/)[1] - 获取两个字符串之间的字符串:
str.match(/a(\S*)b/)[1]
注意事项
小心 g
全局匹配符有个陷阱,多次匹配同一个字符串,可能会出现不同的结果
引用 mdn 文档说明:
如果正则表达式设置了全局标志,
test()的执行会改变正则表达式lastIndex属性。连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串,(exec()同样改变正则本身的lastIndex属性值).
const reg = /hi/g
console.log(reg.test('hi')) true
console.log(reg.test('hi')) false
console.log(reg.test('hi')) true
三次检验的结果,不一样
这里说明下 lastIndex ,这个是 RegExp 对象的属性,只当使用了 g 的时候,才会有用
lastIndex是正则表达式的一个可读可写的整型属性,用来指定下一次匹配的起始索引。
具体规则:
- 如果
lastIndex大于字符串的长度,则regexp.test和regexp.exec将会匹配失败,然后lastIndex被设置为 0。- 如果
lastIndex等于字符串的长度,且该正则表达式匹配空字符串,则该正则表达式匹配从lastIndex开始的字符串。(then the regular expression matches input starting atlastIndex.)- 如果
lastIndex等于字符串的长度,且该正则表达式不匹配空字符串 ,则该正则表达式不匹配字符串,lastIndex被设置为 0.。- 否则,
lastIndex被设置为紧随最近一次成功匹配的下一个位置。
下面解释下每种情况的逻辑:
const reg = /hi/g
console.log(reg.lastIndex, reg.test('hi')) // 0 true
console.log(reg.lastIndex, reg.test('hi')) // 2 false;触发了第三条规则,匹配失败,然后 lastIndex 设置为 0;因为 test 方法是从 lastIndex 开始匹配,所以从第三位字符串匹配的时候,失败了
console.log(reg.lastIndex, reg.test('hi')) // 0 true
console.log(reg.lastIndex) // 2
const reg = /\w*/g
console.log(reg.lastIndex, reg.test('hi')) // true
console.log(reg.lastIndex, reg.test('1hi')) // 2 true
console.log(reg.lastIndex, reg.test('hi')) // 3 false;触发第一条规则,lastIndex 大于字符串长度,所以变位0,且失败
console.log(reg.lastIndex) // 0
使用 g 时,尽量不要缓存该正则
本文详细介绍了JavaScript中的正则表达式属性lastIndex,它用于全局匹配时指定下次匹配的起始位置。当正则表达式包含全局标志'g'时,lastIndex在匹配过程中起到关键作用。文章通过实例解析了lastIndex的各种情况,包括匹配失败、匹配空字符串等场景,并提醒在使用全局匹配时需要注意的陷阱,避免因lastIndex导致的不一致结果。同时,还提及了source属性,它是正则表达式模式的文本副本。
421

被折叠的 条评论
为什么被折叠?



