javascript字符串不可变,所有方法和正则操作均返回新值;正则作为参数由regexp引擎执行,支持search、match、replace、split等;utf-16编码影响匹配,需u标志处理unicode;字面量与构造函数共享引擎但编译时机不同。

字符串不可变性是协作前提
JavaScript 中字符串是不可变的,所有字符串方法(如 slice、replace、toUpperCase)都返回新字符串,原值不受影响。正则操作同样遵循这一原则——replace 不修改原串,match 返回新数组或 null,split 返回新数组。这种设计让正则与字符串的交互天然安全,无需担心副作用。
正则在字符串方法中作为“规则参数”被调用
字符串对象本身不包含正则逻辑,但多个方法接受正则表达式作为参数,将其交由 JS 引擎的 RegExp 引擎执行匹配:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- search():只返回第一个匹配位置索引,内部调用 RegExp 的 exec,但忽略捕获组和全局信息
- match():无 g 标志时返回含 index、input 和捕获组的完整匹配对象;有 g 时仅返回匹配字符串数组(丢弃位置与分组)
- replace():支持函数作为第二个参数,该函数接收匹配项、捕获组、位置、原字符串等参数,实现动态替换逻辑
- split():传入正则时,引擎会扫描整个字符串,将匹配到的分隔符(包括捕获组内容,若存在)从结果中剔除,其余部分构成数组元素
字符编码与 Unicode 处理影响匹配行为
JS 字符串基于 UTF-16 编码,length 属性统计的是 16 位代码单元数量,不是视觉字符数。例如 emoji ?(U+1F30D)或生僻汉字需两个代理单元表示,"?".length === 2。正则默认按代码单元匹配,这会导致:
- . 无法匹配代理对中的高/低位单元(除非使用 u 标志启用 Unicode 模式)
- /[\u4e00-\u9fa5]/ 可匹配常用汉字,但覆盖不全;更健壮写法是 /\p{Script=Han}/u
- 未加 u 标志时,\w、\d 等预定义类仅识别 ASCII 范围,中文数字或全角字符不会被匹配
RegExp 对象与字面量共享同一底层引擎
无论是 /abc/gi 字面量还是 new RegExp("abc", "gi") 构造函数创建的实例,最终都编译为相同的内部正则模式。区别在于:
- 字面量在代码解析阶段即编译,性能略优;构造函数支持运行时拼接字符串生成正则(如 new RegExp(`^${keyword}$`)),但需手动转义特殊字符
- 所有正则方法(test、exec)和字符串方法中传入的正则,均由同一 RegExp 引擎驱动,共享回溯控制、Unicode 支持、标志处理等机制
- 全局正则(带 g)具有 lastIndex 状态,多次调用 exec 会从上次结束位置继续;而字符串方法(如 match)每次调用都重置状态,互不影响
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










