javascript正则表达式是什么_如何用它进行字符串匹配?

13次阅读

javaScript正则表达式regexp对象,用于字符串匹配与处理;创建方式有字面量(/abc/gi)和构造函数(new RegExp(‘abc’,’gi’)),后者需双写反斜杠;test()返回布尔值,exec()返回匹配详情并维护lastIndex;.不匹配换行符,贪婪量词易过度匹配,Unicode需u标志或[sS];实际应用应优先使用成熟校验库。

javascript正则表达式是什么_如何用它进行字符串匹配?

javascript 正则表达式是内建的模式匹配工具,本质是一个 RegExp 对象,用来描述、查找、替换符合特定规则的字符串。它不是“高级技巧”,而是日常处理表单校验、URL 解析、日志提取等任务的基础设施。

怎么创建正则表达式?字面量 vs 构造函数

两种方式,行为基本一致,但动态拼接时必须用构造函数,否则字面量写法无法插入变量。

  • 字面量:/abc/gi —— 简洁,适合静态模式,斜杠之间是模式,后面是标志(如 g 全局、i 忽略大小写)
  • 构造函数:new RegExp('abc', 'gi') —— 模式和标志分离,支持字符串拼接,但反斜杠需双写('\d+' 而非 'd+'
  • 错误高发点:用构造函数时忘记转义反斜杠,导致 new RegExp('d+') 实际传入的是 'd+'(因为 d 在字符串中被解释为非法转义),应写成 new RegExp('\d+')

test()exec() 的核心区别

test() 只返回布尔值,适合判断“有没有匹配”;exec() 返回匹配详情(包括捕获组、索引),且在全局模式下会维护 lastIndex,多次调用可迭代匹配。

const re = /a(b)/g; console.log(re.test('abab')); // true console.log(re.exec('abab')); // ['ab', 'b', index: 0, input: 'abab'] console.log(re.exec('abab')); // ['ab', 'b', index: 2, input: 'abab'] —— 继续从位置 2 开始 console.log(re.exec('abab')); // null —— 已无更多匹配
  • 反复调用 exec() 前,记得检查 re.lastIndex 是否被意外修改(比如其他代码复用了同一个正则对象)
  • 非全局正则调用 exec() 每次都从开头匹配,lastIndex 不起作用
  • 想重置匹配位置?手动设 re.lastIndex = 0

常见陷阱:点号 .、量词、Unicode 字符

. 默认不匹配换行符(nr),这常导致多行文本匹配失败;*+ 是贪婪的,容易“吃掉太多”;中文、emoji 等 Unicode 字符可能被拆成多个码元,影响 w. 行为。

立即学习Java免费学习笔记(深入)”;

  • . 匹配换行:加 s 标志(/a.b/s),注意该标志在旧版 safari 中不支持
  • 避免贪婪匹配:用 *?+?(懒惰量词),例如 /a.*?b/ 匹配最短的以 a 开头、b 结尾的子串
  • 匹配任意 Unicode 字符(含 emoji):用 [sS] 替代 .,或升级到 ES2018 后使用 u 标志 + ././u
  • w 在无 u 标志时只匹配 ASCII 字母数字,中文会被忽略;要匹配中文,请显式写 [u4e00-u9fa5] 或用 /.+/u 配合 String.prototype.codePointAt 等辅助逻辑

正则真正难的不是语法,而是把自然语言需求准确翻译成字符约束条件——比如“邮箱格式”看似简单,但 RFC 5322 定义的合法邮箱远超 /^S+@S+.S+$/;实际项目中,优先用成熟库(如 validator.js)或服务端校验,前端正则只做基础过滤即可。

text=ZqhQzanResources