JavaScript字符串特性

195 阅读2分钟

String.prototype.replaceAll() 的用法。

假设炭治郎正在阅读一本包含错误鬼名字的书,他需要将所有错误的鬼名字替换为正确的名字。

错误的鬼名字书籍

let bookContent = `
炭治郎遇到了一个叫恶鬼的鬼。
恶鬼非常凶残。
为了保护妹妹祢豆子,炭治郎必须击败恶鬼。
`;

// 使用 replaceAll() 将所有的 "恶鬼" 替换为 "无惨"
let correctedBookContent = bookContent.replaceAll('恶鬼', '无惨');

console.log(correctedBookContent);

输出

炭治郎遇到了一个叫无惨的鬼。
无惨非常凶残。
为了保护妹妹祢豆子,炭治郎必须击败无惨。

在这个例子中,我们使用 replaceAll() 方法将所有出现的 "恶鬼" 替换为 "无惨"。这样炭治郎可以正确地识别和对抗鬼。

String.prototype.matchAll() 的用法。

假设我们有一段包含鬼杀队成员名字的文本,我们想找出所有成员名字的位置和内容。

const text = `
炭治郎是鬼杀队的一员。
祢豆子是他的妹妹。
善逸和伊之助是炭治郎的朋友。
蝴蝶忍和富冈义勇是柱。
`;

const regex = /炭治郎|祢豆子|善逸|伊之助|蝴蝶忍|富冈义勇/g;

const matches = text.matchAll(regex);

for (const match of matches) {
  console.log(`找到: ${match[0]} 在位置 ${match.index}`);
}

输出

找到: 炭治郎 在位置 1
找到: 祢豆子 在位置 10
找到: 善逸 在位置 22
找到: 伊之助 在位置 25
找到: 蝴蝶忍 在位置 33
找到: 富冈义勇 在位置 38

在这个例子中,matchAll 返回一个迭代器,用于找到文本中所有匹配的成员名字及其位置。这样,我们可以列出所有鬼杀队成员的出现位置。

RegExp.prototype.hasIndices 属性用法

假设我们有一个字符串,其中包含《鬼灭之刃》中的一些角色名称,并且我们希望找到所有以 "炭" 开头的名字,并获取它们在字符串中的起始和结束位置。

下面是一个具体的例子:

// 我们的字符串中包含《鬼灭之刃》中的一些角色名称
const text = "炭治郎、祢豆子、善逸、伊之助、炭治郎和祢豆子。";

// 正则表达式,匹配以 "炭" 开头的名字
const regex = /炭\w+/gd;

// 使用 hasIndices 属性
console.log(regex.hasIndices); // true

// 获取匹配结果
const matches = [...text.matchAll(regex)];

matches.forEach(match => {
  // match.indices[0] 包含匹配的起始和结束位置
  const start = match.indices[0][0];
  const end = match.indices[0][1];
  console.log(`匹配到的名字: "${match[0]}" 在位置: ${start}-${end}`);
});

在这个例子中,我们使用了带有 d 标志的正则表达式 /炭\w+/gd,其中:

  • /炭\w+/ 是我们的正则表达式,匹配以 "炭" 开头的名字。
  • g 标志表示全局搜索,匹配所有符合条件的子字符串。
  • d 标志表示启用匹配索引信息。

运行这段代码时:

  1. regex.hasIndices 会返回 true,表示我们启用了索引信息。
  2. text.matchAll(regex) 将返回一个迭代器,其中包含匹配的所有结果。
  3. 我们遍历这些匹配结果,并分别输出每个匹配子字符串的起始和结束位置。

输出将会是:

匹配到的名字: "炭治郎" 在位置: 0-3
匹配到的名字: "炭治郎" 在位置: 18-21

这样,我们就可以清楚地看到每个匹配的名字在字符串中的具体位置。这对于需要精确定位匹配结果的场景非常有用。

带索引的正则表达式匹配(hasIndices

假设我们有一段描述鬼杀队成员战斗情况的文本,并且我们想找到所有成员名字及其在文本中的索引。

const text = `
炭治郎和祢豆子正在与无惨战斗。
善逸和伊之助也赶来支援。
`;

// 创建正则表达式并启用索引捕获
const regex = /炭治郎|祢豆子|善逸|伊之助/gd;

const matches = [...text.matchAll(regex)];

matches.forEach(match => {
  console.log(`找到: ${match[0]} 在位置 [${match.indices[0][0]}, ${match.indices[0][1]}]`);
});

输出

找到: 炭治郎 在位置 [1, 4]
找到: 祢豆子 在位置 [5, 8]
找到: 善逸 在位置 [19, 21]
找到: 伊之助 在位置 [22, 25]

在这个例子中,我们使用 hasIndices 标志 (d) 来启用匹配索引捕获。match.indices 返回每个匹配的开始和结束位置,使我们能够精确地定位每个名字在文本中的位置。