正则匹配的原理分析
正则表达式是一种匹配文本模式的强大工具。在 javascript 中,可以使用 regexp 对象来创建和使用正则表达式。
问题:
以下代码中的正则表达式匹配结果令人困惑:
let str = /街|道|中/g; console.log(regexp(str).test('道路'),regexp(str).test('中'));//true false console.log(regexp(str).test('道路'),regexp(/街|道|中/g).test('中'));//true true
原理:
创建正则表达式实例:
javascript 允许使用两种方法创建正则表达式实例:
在使用 regexp() 构造函数时,参数 str 应该是一个字符串形式的正则表达式。
全局标志 (g):
全局标志 (g) 使正则表达式能够在字符串中全局匹配,而不是只匹配第一个匹配项。每次使用 .test() 方法时,都会从上次匹配的字符后继续搜索。
问题的原因:
问题发生在第二组测试中,即:
console.log(RegExp(str).test('道路'),RegExp(/街|道|中/g).test('中'));
第一次调用 regexp(str).test('道路') 后,正则表达式将继续从 "道" 字符后匹配。因此,第二次调用 regexp(/街|道|中/g).test('中') 时,正则表达式将从 "道" 字符后开始搜索,无法匹配 "中" 字符。
而对于直接使用原始正则表达式 /街|道|中/g 进行测试时,每次调用 .test() 都会从字符串的起始位置开始搜索,因此返回的结果正确。
总结:
在使用正则表达式时,重要的是要理解全局标志 (g) 的影响。连续测试正则表达式时,它会导致匹配位置发生变化,导致意想不到的结果。因此,通常不需要对已有的正则表达式实例再用 regexp() 包装一次。
Vue3 computed属性导致栈溢出:如何排查和解决minDate和maxDate计算属性的无限循环问题?
承诺解决了
掌握JavaScript中的数组方法:map、filter和reduce
构建您的第一个 WebAssembly 项目
页面关闭时Ajax请求失效:如何处理?
在计算机领域中,“pattern”这个词通常翻译为“模式”。这个词在不同的上下文中有不同的具体含义,例如在设计模式(design patterns)中,它指的是解决特定设计问题的可重用解决方案;在模式识别(pattern recognition)中,它指的是数据中的规律或结构。在编程和算法中,“pattern”也常用于描述字符串匹配或正则表达式中的模式。