js 正则匹配问题?

let str = /街|道|中/g
    console.log(RegExp(str).test('道路'),RegExp(str).test('中'));//true false
    console.log(RegExp(str).test('道路'),RegExp(/街|道|中/g).test('中'));//true true

这是什么原理

阅读 715
1 个回答

在JavaScript中,RegExp对象可以接受一个字符串作为参数来创建一个新的正则表达式实例。然而,在你给出的例子中,存在对正则表达式的误解。

第一部分:

let str = /街|道|中/g;
console.log(RegExp(str).test('道路')); // true
console.log(RegExp(str).test('中'));   // false

这里,str 已经是一个正则表达式实例( /街|道|中/g ),它表示匹配“街”、“道”或“中”中的任意一个,并且是全局搜索(g 标志)。当你用 RegExp(str) 创建一个新的正则表达式时,实际上是对已经存在的正则表达式进行了一次不必要的包装。

由于正则表达式 /街|道|中/g 中的 g 标志意味着在执行 .test() 方法时会从当前位置开始查找匹配项,而不会重置为字符串的起始位置。所以第二次调用 test('中') 时,因为上一次匹配了 "道",下一次查找的位置不是字符串的起始位置,因此返回 false。

第二部分:

console.log(RegExp(str).test('道路')); // true
console.log(/街|道|中/g.test('中'));   // true

这次第二个测试语句直接使用了原始的正则表达式 /街|道|中/g 来执行 .test('中'),每次 .test() 都会从字符串的起始位置开始查找,所以即使在之前的查找中匹配过其他字符,再次查找仍能正确匹配到 "中" 字符,因此返回 true。

总的来说,问题出在对正则表达式的连续测试以及全局标志 (g) 导致的 lastIndex 状态改变上。在实际应用中,通常不需要对已有的正则表达式实例再用 RegExp() 包装一次。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题