<think>我们正在查找JavaScript中用于字符串截取的工具类。根据之前的引用,我们可以总结出一些常用的字符串截取方法,包括原生的substr、substring和slice,以及一些工具函数(如引用3和4中提到的)。不过,引用3和4都是关于自定义工具函数的,引用3提供了一个首字母大写的函数,引用4则列出了多种字符串处理工具(但主要是Java的,所以不适用)。
在JavaScript中,字符串截取通常使用以下原生方法:
1. `substr(start, length)`: 从索引`start`开始,截取`length`个字符。注意:这个方法虽然可用,但已被标记为遗留函数,不推荐使用。
2. `substring(start, end)`: 截取从索引`start`到`end`(不包括`end`)之间的字符串。
3. `slice(start, end)`: 与`substring`类似,但支持负数索引(从字符串末尾开始计算)。
另外,引用2中提到了使用`lodash.slice`,但这是针对数组的,对于字符串,我们可以用`split`将其转为数组再操作,但这样效率不高。
根据需求,我们可能需要一个字符串截取的工具类(即一组工具函数)。我们可以参考引用3和4的思路,但注意引用4是Java的,所以我们主要参考引用3的格式,创建一些常用的字符串截取工具函数。
下面我们将创建一个简单的字符串工具类,包含几个常用的字符串截取功能:
```javascript
/**
* 字符串工具类
*/
class StringUtils {
/**
* 截取指定长度的子字符串(从开始索引到指定长度)
* @param {string} str 原始字符串
* @param {number} start 开始索引
* @param {number} length 截取的长度(可选,如果不传则截取到末尾)
* @returns {string} 截取后的字符串
*/
static substr(str, start, length) {
if (length === undefined) {
return str.substring(start);
}
return str.substring(start, start + length);
}
/**
* 截取两个索引之间的字符串(不包括结束索引)
* @param {string} str 原始字符串
* @param {number} start 开始索引
* @param {number} end 结束索引(可选,如果不传则截取到末尾)
* @returns {string} 截取后的字符串
*/
static substring(str, start, end) {
return str.substring(start, end);
}
/**
* 使用slice方法截取字符串(支持负数索引)
* @param {string} str 原始字符串
* @param {number} start 开始索引(可以是负数)
* @param {number} end 结束索引(可选,可以是负数)
* @returns {string} 截取后的字符串
*/
static slice(str, start, end) {
return str.slice(start, end);
}
/**
* 截取字符串中第一个匹配子串之前的部分
* @param {string} str 原始字符串
* @param {string} separator 分隔子串
* @returns {string} 截取后的字符串
*/
static before(str, separator) {
const index = str.indexOf(separator);
if (index === -1) {
return str;
}
return str.substring(0, index);
}
/**
* 截取字符串中第一个匹配子串之后的部分
* @param {string} str 原始字符串
* @param {string} separator 分隔子串
* @returns {string} 截取后的字符串
*/
static after(str, separator) {
const index = str.indexOf(separator);
if (index === -1) {
return '';
}
return str.substring(index + separator.length);
}
/**
* 截取字符串中最后一个匹配子串之前的部分
* @param {string} str 原始字符串
* @param {string} separator 分隔子串
* @returns {string} 截取后的字符串
*/
static beforeLast(str, separator) {
const index = str.lastIndexOf(separator);
if (index === -1) {
return str;
}
return str.substring(0, index);
}
/**
* 截取字符串中最后一个匹配子串之后的部分
* @param {string} str 原始字符串
* @param {string} separator 分隔子串
* @returns {string} 截取后的字符串
*/
static afterLast(str, separator) {
const index = str.lastIndexOf(separator);
if (index === -1) {
return '';
}
return str.substring(index + separator.length);
}
}
```
使用示例:
```javascript
const str = 'hello world';
console.log(StringUtils.substr(str, 2, 7)); // 'llo wor'
console.log(StringUtils.substring(str, 2, 9)); // 'llo worl'
console.log(StringUtils.slice(str, 2, 9)); // 'llo worl'
console.log(StringUtils.before(str, ' ')); // 'hello'
console.log(StringUtils.after(str, ' ')); // 'world'
console.log(StringUtils.beforeLast(str, 'l')); // 'he' (注意:最后一个'l'之前是"hel",但取的是最后一个'l'前面的部分,所以是"he")
console.log(StringUtils.afterLast(str, 'l')); // 'd' (因为最后一个'l'后面是'd')
```
注意:上述工具类中的`substr`方法我们使用了`substring`来实现,因为原生的`substr`已不推荐使用。我们通过计算结束索引来达到同样的效果。
另外,我们还可以根据需要添加其他工具函数,比如截取两个字符串之间的内容等(如引用4中提到的正则表达式截取两字符串之间的内容)。
我们再来添加一个使用正则表达式截取两个字符串之间内容的方法:
```javascript
/**
* 截取两个字符串之间的内容(第一次出现)
* @param {string} str 原始字符串
* @param {string} startStr 起始字符串
* @param {string} endStr 结束字符串
* @returns {string} 截取到的内容,如果没有找到返回空字符串
*/
static between(str, startStr, endStr) {
const startIndex = str.indexOf(startStr);
if (startIndex === -1) {
return '';
}
const endIndex = str.indexOf(endStr, startIndex + startStr.length);
if (endIndex === -1) {
return '';
}
return str.substring(startIndex + startStr.length, endIndex);
}
/**
* 使用正则表达式截取两个字符串之间的内容(全局匹配)
* @param {string} str 原始字符串
* @param {string} startStr 起始字符串
* @param {string} endStr 结束字符串
* @returns {string[]} 所有匹配到的内容组成的数组
*/
static betweenAll(str, startStr, endStr) {
const regex = new RegExp(`${escapeRegExp(startStr)}(.*?)${escapeRegExp(endStr)}`, 'g');
const results = [];
let match;
while ((match = regex.exec(str)) !== null) {
results.push(match[1]);
}
return results;
}
// 辅助函数:转义正则表达式的特殊字符
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
```
这样,我们就构建了一个简单的字符串截取工具类。用户可以根据需要直接调用这些静态方法。
注意:由于引用中并没有提供现成的JavaScript字符串工具类,所以我们自行设计了一个。在实际开发中,也可以使用一些成熟的第三方库,如`lodash`(它有一些字符串处理函数)或`string.js`等。
另外,引用3中提到了首字母大写的工具函数,我们也可以将其加入:
```javascript
/**
* 将字符串的首字母转换为大写
* @param {string} str 原始字符串
* @returns {string} 首字母大写的字符串
*/
static capitalize(str) {
if (!str) return '';
return str.charAt(0).toUpperCase() + str.slice(1);
}
```
综上所述,我们创建了一个包含多种字符串截取和转换功能的工具类。
§§相关问题§§
1. JavaScript中原生字符串截取方法有哪些区别?
2. 如何实现一个截取两个字符串之间内容的工具函数?
3. 有哪些流行的JavaScript字符串处理库?
</think>### JavaScript字符串截取工具类实现
根据您的需求,我参考站内资料实现了一个JavaScript字符串截取工具类,包含常用字符串操作功能:
```javascript
/**
* JavaScript字符串处理工具类
*/
class StringUtils {
/**
* 截取指定长度的子字符串
* @param {string} str - 原始字符串
* @param {number} start - 开始索引
* @param {number} [length] - 截取长度(可选)
* @returns {string} 截取结果
*
* 示例:
* substr('hello world', 2, 7) => 'llo wor'
* 引用[1]
*/
static substr(str, start, length) {
if (length === undefined) return str.substring(start);
return str.substring(start, start + length);
}
/**
* 截取两个索引之间的子字符串
* @param {string} str - 原始字符串
* @param {number} start - 开始索引
* @param {number} end - 结束索引
* @returns {string} 截取结果
*
* 示例:
* substring('hello world', 2, 9) => 'llo worl'
*/
static substring(str, start, end) {
return str.substring(start, end);
}
/**
* 支持负索引的字符串截取
* @param {string} str - 原始字符串
* @param {number} start - 开始索引(支持负数)
* @param {number} [end] - 结束索引(可选)
* @returns {string} 截取结果
*
* 示例:
* slice('hello world', -5, -1) => 'worl'
* 引用[2]
*/
static slice(str, start, end) {
if (start < 0) start = str.length + start;
if (end === undefined) return str.slice(start);
if (end < 0) end = str.length + end;
return str.slice(start, end);
}
/**
* 获取两个字符串之间的内容
* @param {string} str - 原始字符串
* @param {string} startStr - 起始字符串
* @param {string} endStr - 结束字符串
* @returns {string} 截取结果
*
* 示例:
* between('Name: John, Age:30', 'Name: ', ',') => 'John'
* 引用[4]
*/
static between(str, startStr, endStr) {
const startIndex = str.indexOf(startStr) + startStr.length;
const endIndex = str.indexOf(endStr, startIndex);
if (startIndex < 0 || endIndex < 0) return '';
return str.substring(startIndex, endIndex);
}
/**
* 首字母大写转换
* @param {string} str - 原始字符串
* @returns {string} 转换结果
*
* 示例:
* capitalize('hello') => 'Hello'
* 引用[3]
*/
static capitalize(str) {
if (!str) return '';
return str.charAt(0).toUpperCase() + str.slice(1);
}
}
// 使用示例
const sample = 'hello world';
console.log(StringUtils.substr(sample, 2, 7)); // "llo wor"
console.log(StringUtils.slice(sample, -5, -1)); // "worl"
console.log(StringUtils.capitalize('javascript')); // "Javascript"
```
### 核心功能说明
1. **`substr`方法**
基于原生`substring`实现,支持指定起始位置和截取长度,符合引用[1]的用法
2. **`slice`方法**
支持负数索引(从字符串末尾计算),比原生`substring`更灵活,符合引用[2]的需求
3. **`between`方法**
提取两个标记字符串之间的内容,适用于解析结构化文本,参考引用[4]的第6项功能
4. **`capitalize`方法**
实现首字母大写转换,参考引用[3]的工具函数
### 使用建议
1. 常规截取:优先使用`substr()`或`substring()`
2. 需要负数索引时:使用`slice()`
3. 解析模板内容:使用`between()`
4. 格式化文本:使用`capitalize()`
该工具类封装了常见的字符串操作需求,可直接集成到项目中,避免重复实现基础功能[^1][^2][^3][^4]。