MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

JavaScript字符串处理与常用方法

2021-11-115.5k 阅读

JavaScript字符串基础

在JavaScript中,字符串是表示文本的数据类型。字符串可以用单引号(')、双引号(")或反引号(```)括起来。例如:

let str1 = '这是一个单引号字符串';
let str2 = "这是一个双引号字符串";
let str3 = `这是一个反引号字符串`;

反引号字符串具有一些独特的特性,它允许嵌入表达式。例如:

let num = 10;
let result = `数字 ${num} 的平方是 ${num * num}`;
console.log(result); 

上述代码中,通过 ${} 的形式在反引号字符串中嵌入了表达式 numnum * num

字符串长度

可以使用 length 属性来获取字符串的长度。例如:

let str = "Hello, World!";
console.log(str.length); 

这里,str.length 返回字符串 str 中字符的数量,包括空格和标点符号。

字符访问

在JavaScript中,可以通过索引来访问字符串中的单个字符。字符串的索引从0开始。例如:

let str = "JavaScript";
console.log(str[0]); 
console.log(str[4]); 

但是需要注意的是,JavaScript字符串是不可变的。这意味着一旦创建了一个字符串,就不能直接修改它的内容。例如:

let str = "Hello";
str[0] = 'J'; 
console.log(str); 

上述代码并不会将 str 的第一个字符修改为 'J',因为字符串不可变。如果要修改字符串内容,需要创建一个新的字符串。

字符串拼接

使用 + 运算符

最基本的字符串拼接方式是使用 + 运算符。例如:

let str1 = "Hello";
let str2 = " World";
let result = str1 + str2;
console.log(result); 

使用 += 运算符

+= 运算符可以在现有字符串基础上追加内容。例如:

let str = "Hello";
str += ", World!";
console.log(str); 

使用数组的 join 方法

可以先将字符串片段存储在数组中,然后使用 join 方法将它们拼接成一个字符串。例如:

let parts = ["Hello", " ", "World", "!"];
let result = parts.join('');
console.log(result); 

join 方法的参数是用于连接数组元素的分隔符,如果不传入参数,则默认使用空字符串。

常用字符串查找方法

indexOf 方法

indexOf 方法用于查找字符串中指定子字符串第一次出现的位置。如果找到,则返回子字符串的起始位置;如果未找到,则返回 -1。例如:

let str = "Hello, World!";
console.log(str.indexOf("World")); 
console.log(str.indexOf("world")); 

indexOf 方法还可以接受第二个参数,表示从字符串的哪个位置开始查找。例如:

let str = "Hello, World! Hello, JavaScript!";
console.log(str.indexOf("Hello", 7)); 

lastIndexOf 方法

lastIndexOf 方法与 indexOf 方法类似,但它查找的是子字符串最后一次出现的位置。例如:

let str = "Hello, World! Hello, JavaScript!";
console.log(str.lastIndexOf("Hello")); 

同样,lastIndexOf 方法也可以接受第二个参数,表示从字符串的哪个位置开始查找,只不过查找方向是从后往前。

includes 方法

includes 方法用于判断字符串中是否包含指定的子字符串,返回一个布尔值。例如:

let str = "Hello, World!";
console.log(str.includes("World")); 
console.log(str.includes("world")); 

includes 方法也可以接受第二个参数,表示从字符串的哪个位置开始查找。例如:

let str = "Hello, World! Hello, JavaScript!";
console.log(str.includes("Hello", 7)); 

字符串截取方法

slice 方法

slice 方法用于提取字符串的某个部分,并返回一个新的字符串。它接受两个参数,第一个参数是起始位置(包括),第二个参数是结束位置(不包括)。如果省略第二个参数,则截取到字符串末尾。例如:

let str = "Hello, World!";
console.log(str.slice(0, 5)); 
console.log(str.slice(7)); 

如果参数为负数,则从字符串末尾开始计数。例如:

let str = "Hello, World!";
console.log(str.slice(-6, -1)); 

substring 方法

substring 方法与 slice 方法类似,也是用于截取字符串。但它的参数处理略有不同,它会自动将较小的参数作为起始位置,较大的参数作为结束位置。例如:

let str = "Hello, World!";
console.log(str.substring(0, 5)); 
console.log(str.substring(5, 0)); 

slice 不同的是,substring 方法不接受负数参数。如果传入负数,会被自动转换为0。

substr 方法

substr 方法也用于截取字符串,它接受两个参数,第一个参数是起始位置,第二个参数是要截取的字符长度。例如:

let str = "Hello, World!";
console.log(str.substr(0, 5)); 
console.log(str.substr(7, 5)); 

如果第一个参数为负数,则从字符串末尾开始计数。例如:

let str = "Hello, World!";
console.log(str.substr(-6, 5)); 

字符串大小写转换方法

toUpperCase 方法

toUpperCase 方法用于将字符串中的所有字符转换为大写。例如:

let str = "hello, world!";
console.log(str.toUpperCase()); 

toLowerCase 方法

toLowerCase 方法用于将字符串中的所有字符转换为小写。例如:

let str = "HELLO, WORLD!";
console.log(str.toLowerCase()); 

字符串去除空白方法

trim 方法

trim 方法用于去除字符串两端的空白字符(包括空格、制表符、换行符等),并返回一个新的字符串。例如:

let str = "   Hello, World!   ";
console.log(str.trim()); 

trimStart 方法

trimStart 方法(也可写作 trimLeft)用于去除字符串开头的空白字符,并返回一个新的字符串。例如:

let str = "   Hello, World!   ";
console.log(str.trimStart()); 

trimEnd 方法

trimEnd 方法(也可写作 trimRight)用于去除字符串末尾的空白字符,并返回一个新的字符串。例如:

let str = "   Hello, World!   ";
console.log(str.trimEnd()); 

字符串替换方法

replace 方法

replace 方法用于在字符串中用一些字符替换另一些字符,返回替换后的新字符串。它接受两个参数,第一个参数可以是字符串或正则表达式,第二个参数是要替换成的字符串。例如:

let str = "Hello, World!";
let newStr = str.replace("World", "JavaScript");
console.log(newStr); 

如果第一个参数是正则表达式,且正则表达式没有 g 标志,replace 方法只会替换第一个匹配项。例如:

let str = "Hello, Hello!";
let newStr = str.replace(/Hello/, "Hi");
console.log(newStr); 

要替换所有匹配项,需要在正则表达式中添加 g 标志。例如:

let str = "Hello, Hello!";
let newStr = str.replace(/Hello/g, "Hi");
console.log(newStr); 

replaceAll 方法

replaceAll 方法是ES2021引入的,它可以直接替换字符串中所有匹配的子字符串。例如:

let str = "Hello, Hello!";
let newStr = str.replaceAll("Hello", "Hi");
console.log(newStr); 

replaceAll 方法的第一个参数也可以是正则表达式。例如:

let str = "1, 2, 3, 4";
let newStr = str.replaceAll(/\d/g, "X");
console.log(newStr); 

字符串分割方法

split 方法

split 方法用于将字符串分割成子字符串数组。它接受一个分隔符作为参数,根据分隔符将字符串进行分割。例如:

let str = "Hello, World! Hello, JavaScript!";
let parts = str.split(", ");
console.log(parts); 

如果 split 方法的参数为空字符串,则会将字符串拆分成单个字符的数组。例如:

let str = "Hello";
let parts = str.split('');
console.log(parts); 

split 方法还可以接受第二个参数,用于指定数组的最大长度。例如:

let str = "Hello, World! Hello, JavaScript!";
let parts = str.split(", ", 2);
console.log(parts); 

字符串填充方法

padStart 方法

padStart 方法用于在字符串的开头填充指定的字符,直到达到指定的长度。它接受两个参数,第一个参数是目标长度,第二个参数是要填充的字符(默认为空格)。例如:

let str = "5";
let newStr = str.padStart(5, '0');
console.log(newStr); 

padEnd 方法

padEnd 方法与 padStart 方法类似,但它是在字符串的末尾填充指定的字符。例如:

let str = "5";
let newStr = str.padEnd(5, '0');
console.log(newStr); 

字符串比较方法

在JavaScript中,可以使用比较运算符(如 ><>=<=)来比较字符串。比较是基于字符的Unicode代码点进行的。例如:

console.log("apple" < "banana"); 
console.log("banana" > "cherry"); 

如果需要更精确的字符串比较,可以使用 localeCompare 方法。localeCompare 方法会考虑到本地化规则进行比较。例如:

console.log("äpple".localeCompare("banana")); 

localeCompare 方法返回一个数字,如果返回值小于0,表示第一个字符串在排序顺序上位于第二个字符串之前;如果返回值大于0,表示第一个字符串在排序顺序上位于第二个字符串之后;如果返回值为0,表示两个字符串相等。

模板字面量与标签函数

模板字面量除了可以嵌入表达式外,还可以与标签函数一起使用。标签函数可以对模板字面量进行处理。例如:

function tagFunction(strings, ...values) {
    let result = '';
    for (let i = 0; i < strings.length; i++) {
        result += strings[i];
        if (i < values.length) {
            result += values[i].toUpperCase();
        }
    }
    return result;
}

let num = 10;
let result = tagFunction`数字 ${num} 的平方是 ${num * num}`;
console.log(result); 

在上述代码中,tagFunction 是一个标签函数,strings 数组包含模板字面量中的字符串部分,...values 包含嵌入的表达式的值。标签函数可以根据需求对这些内容进行处理。

正则表达式与字符串

JavaScript中的正则表达式是一种强大的工具,用于匹配和处理字符串。可以使用 RegExp 对象或正则表达式字面量来创建正则表达式。例如:

let pattern1 = new RegExp('hello', 'i'); 
let pattern2 = /hello/i; 

这里,'i' 是一个标志,表示不区分大小写匹配。

正则表达式可以与字符串的多种方法一起使用,如 matchsearchreplace 等。

match 方法

match 方法用于在字符串中查找匹配正则表达式的内容,并返回一个数组。例如:

let str = "Hello, Hello!";
let result = str.match(/Hello/g);
console.log(result); 

如果正则表达式没有 g 标志,match 方法只会返回第一个匹配项。例如:

let str = "Hello, Hello!";
let result = str.match(/Hello/);
console.log(result); 

search 方法

search 方法用于在字符串中查找匹配正则表达式的位置,返回第一个匹配项的起始位置,如果未找到则返回 -1。例如:

let str = "Hello, World!";
let position = str.search(/World/);
console.log(position); 

replace 方法(与正则表达式结合)

前面已经介绍过 replace 方法与正则表达式结合的基本用法。除了简单的字符串替换,还可以在替换字符串中使用特殊的变量。例如:

let str = "Hello, 123!";
let newStr = str.replace(/(\d+)/, function(match, p1) {
    return parseInt(p1) * 2;
});
console.log(newStr); 

在上述代码中,(\d+) 是一个捕获组,match 是整个匹配的字符串,p1 是捕获组内匹配的字符串。通过函数返回值来进行替换。

国际化与字符串处理

在处理国际化字符串时,JavaScript提供了一些方法来处理不同语言和地区的字符串格式化、排序等。例如,Intl.NumberFormatIntl.DateTimeFormat 可以根据用户的地区设置格式化数字和日期。

对于字符串排序,localeCompare 方法会考虑到本地化规则。例如,在某些语言中,字母的排序顺序可能与英语不同。通过 localeCompare 方法可以确保按照正确的本地化顺序进行比较和排序。

另外,一些库如 i18next 可以帮助更方便地进行国际化字符串处理,包括翻译、本地化格式化等。

性能考虑

在进行字符串处理时,性能是一个需要考虑的因素。例如,使用 + 运算符进行大量字符串拼接会导致性能问题,因为每次拼接都会创建一个新的字符串对象。在这种情况下,可以使用数组的 join 方法来提高性能。

对于正则表达式匹配,复杂的正则表达式可能会导致性能下降。尽量使用简单的正则表达式,并避免在循环中频繁创建正则表达式对象。

在处理大字符串时,一些方法如 splitreplace 等可能会消耗较多的内存和时间。需要根据具体情况选择合适的处理方式,或者进行分批处理。

实践案例

案例一:统计单词出现次数

假设我们有一个文本字符串,需要统计其中每个单词出现的次数。

let text = "JavaScript is a programming language. JavaScript is popular.";
let words = text.split(/\W+/);
let wordCount = {};
for (let word of words) {
    if (word) {
        if (!wordCount[word]) {
            wordCount[word] = 1;
        } else {
            wordCount[word]++;
        }
    }
}
console.log(wordCount); 

在上述代码中,首先使用正则表达式 /\W+/ 将文本字符串按非单词字符分割成单词数组,然后通过循环统计每个单词出现的次数,并存储在对象 wordCount 中。

案例二:格式化电话号码

假设我们有一个电话号码字符串,需要将其格式化为特定的格式。例如,将 1234567890 格式化为 (123) 456 - 7890

let phoneNumber = "1234567890";
let formattedNumber = phoneNumber.replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2 - $3');
console.log(formattedNumber); 

这里使用 replace 方法和正则表达式捕获组来实现电话号码的格式化。

案例三:验证邮箱地址

可以使用正则表达式来验证邮箱地址的格式是否正确。

function validateEmail(email) {
    const re = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
    return re.test(email);
}

let email1 = "test@example.com";
let email2 = "test.example.com";
console.log(validateEmail(email1)); 
console.log(validateEmail(email2)); 

上述代码定义了一个 validateEmail 函数,使用正则表达式来验证邮箱地址的格式。

总结

JavaScript提供了丰富的字符串处理方法,涵盖了从基本的拼接、查找、截取到复杂的正则表达式匹配和国际化处理等功能。在实际应用中,需要根据具体需求选择合适的方法,并注意性能问题。通过熟练掌握这些字符串处理方法,可以高效地处理文本数据,开发出功能强大的JavaScript应用程序。无论是前端网页开发还是后端Node.js开发,字符串处理都是必不可少的技能。在实际编程中,多进行实践和优化,以达到最佳的编程效果。