这个正则表达式如何使用它的捕获组将单引号替换为双引号

问题描述 投票:0回答:1

let text =“‘我是厨师,’他说,‘这是我的工作。’”;

Console.log(text.replace(/(^|\W)'|'(\W|$)/g, '$1"$2'));

此代码的目的是将句子中的单引号转换为双引号,而不影响像 aren't

这样的缩写中使用的单引号

我理解 or 语句以及所有内容,甚至是管道符。我只是不明白每个单引号的捕获和替换是如何完成的。对于每个被替换的单引号,$1 和 $2 的值是多少。很困惑吗?

我了解所使用的正则表达式。我只是不完全理解它在这个特定场景中是如何执行的。

首先它检查行首 (^) 是否包含单引号。它在第一个单词(“我是”)中找到一个。因此,假设第一个捕获是 ^ 指示行的开头。所以 $1 是一个空位。现在我不明白它是如何得到2美元的。因为我知道它必须获得 $2,所以它可以在它们之间放置双引号以获得 $1"$2。

javascript nsregularexpression
1个回答
0
投票

$1
是每场比赛的第一个捕获组的值,
$2
是每场比赛的第二个捕获组的值。您还可以通过将函数而不是字符串传递给
replace
来在代码中获取这些内容。该函数接收完整匹配作为其第一个参数,第一个捕获组作为其第二个,第二个捕获组作为其第三个,依此类推。因此,如果您想查看发生了什么,请切换到函数并使用调试器来查看(在下面)
c1
c2
的值(或者像我在这个片段中那样将它们注销)。请注意,由于存在轮换,因此您只能拥有一组或另一组。当您使用带有
$1
$2
等占位符的替换字符串时,当组的值为
replace
时,
""
使用
undefined
;但如果您提供替换函数,该函数会收到
undefined
并且您必须在代码中处理它。这是一个例子:

let text = "'I'm the cook,' he said, 'it's my job.'";
console.log(text.replace(/(^|\W)'|'(\W|$)/g, (match, c1, c2) => {
    // Replace `undefined` with `""` as `$1` and `$2` do
    c1 ??= "";
    c2 ??= "";
    // Build result
    const result = `${c1}"${c2}`;
    // Show what was received and what result was produced
    console.log({match, c1, c2, result});
    // Return the result
    return result;
}));
.as-console-wrapper {
    max-height: 100% !important;
}

© www.soinside.com 2019 - 2024. All rights reserved.