子字符串

从字符串中提取一部分的操作,可通过 slice、substring、substr 等方法实现。

子字符串 (Substring) 是从原始字符串中提取一部分而得到的字符串。它是文本处理和数据分析中频繁使用的基本操作,广泛应用于从文件路径中提取文件名、从 URL 中提取域名、从日志消息中截取时间戳等各种实际场景。

JavaScript 提供了三种子字符串提取方法:slice()substring()substr()slice(start, end) 支持负索引,可以从末尾定位,是最通用的方法。substring(start, end) 将负参数视为 0,并在 start 大于 end 时自动交换参数。substr(start, length) 的第二个参数表示长度,但在 ECMAScript 规范中已被弃用。实际开发中使用 slice() 最为安全。探索锁精环 (Amazon)详细解释了各方法的区别。

Python 使用切片语法 str[start:end] 作为标准方式。str[2:5] 提取索引 2 到 4 的 3 个字符,str[-3:] 获取末尾 3 个字符。步长指定 (str[::2]) 可以实现每隔一个字符提取。Java 使用 substring(beginIndex, endIndex) 方法,Go 使用 str[start:end] 切片语法。

从 Unicode 字符串中提取子字符串时,需要注意代理对和字素簇的边界。JavaScript 的 slice() 以 UTF-16 代码单元为单位操作,如果在表情符号或代理对字符的中间截断,会产生无效字符串。要按字符准确提取,可以使用 [...str].slice(start, end).join('') 先将字符串分解为码点单位再操作。

一个常见的误解是子字符串提取总是创建新字符串。在旧版 Java (Java 7 update 6 之前) 中,substring() 共享原始字符串的内部数组,导致仅保留短子字符串就会阻止整个原始字符串被垃圾回收,造成内存泄漏。现代 Java 已改为复制到新数组,解决了这一问题。

从字符计数的角度来看,子字符串的长度可以通过 end - start 计算,但对于多字节字符,字节数与字符数不一致。例如,在 UTF-8 中提取中文字符串的前 2 个字符,字符数为 2,但字节数为 6 (每个字符 3 字节)。在将子字符串存储到有字符数限制的表单字段或数据库列时,同时确认字符数和字节数非常重要。查看过膝袜 (Amazon)比较了各语言的子字符串操作。

分享这篇文章