let str = /街|道|中/g
console.log(RegExp(str).test('道路'),RegExp(str).test('中'));//true false
console.log(RegExp(str).test('道路'),RegExp(/街|道|中/g).test('中'));//true true
这是什么原理
let str = /街|道|中/g
console.log(RegExp(str).test('道路'),RegExp(str).test('中'));//true false
console.log(RegExp(str).test('道路'),RegExp(/街|道|中/g).test('中'));//true true
这是什么原理
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答4.9k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
在JavaScript中,RegExp对象可以接受一个字符串作为参数来创建一个新的正则表达式实例。然而,在你给出的例子中,存在对正则表达式的误解。
第一部分:
这里,str 已经是一个正则表达式实例( /街|道|中/g ),它表示匹配“街”、“道”或“中”中的任意一个,并且是全局搜索(g 标志)。当你用 RegExp(str) 创建一个新的正则表达式时,实际上是对已经存在的正则表达式进行了一次不必要的包装。
由于正则表达式 /街|道|中/g 中的 g 标志意味着在执行 .test() 方法时会从当前位置开始查找匹配项,而不会重置为字符串的起始位置。所以第二次调用 test('中') 时,因为上一次匹配了 "道",下一次查找的位置不是字符串的起始位置,因此返回 false。
第二部分:
这次第二个测试语句直接使用了原始的正则表达式 /街|道|中/g 来执行 .test('中'),每次 .test() 都会从字符串的起始位置开始查找,所以即使在之前的查找中匹配过其他字符,再次查找仍能正确匹配到 "中" 字符,因此返回 true。
总的来说,问题出在对正则表达式的连续测试以及全局标志 (g) 导致的 lastIndex 状态改变上。在实际应用中,通常不需要对已有的正则表达式实例再用 RegExp() 包装一次。