JavaScript 字符串替换中是否有子匹配组引用的 delimiter/disambiguation 语法?
Is there a delimiter/disambiguation syntax for submatch group references in JavaScript string replacement?
这一定已经有答案了,但我什至不知道要搜索什么。
在 JavaScript 中,我可以在替换字符串中引用带括号的子匹配,如下所示:
"abcdefghijklmnopqrstuvwxyz".replace(/(.)/g, "-");
// Result: "a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-"
现在,我想在每个字母之间放置一个 1
而不是 -
:
"abcdefghijklmnopqrstuvwxyz".replace(/(.)/g, "");
// Result: "a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t1u1v1w1x1y1z1"
至少 Chromium 似乎检测到没有子匹配组 11,因此它将替换字符串解释为“子匹配组 1 后跟一个 1”。
我们假设有 11 个组:
'abcdefghijklmnopqrstuvwxyz'.replace(/^(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)$/, '');
// Result: "k"
我想知道的:
- 示例 2 可以跨浏览器运行吗?它是否在某个地方定义了它应该像这样的行为?
- 有没有办法明确界定子匹配组引用?类似于 bash 中的内容,其中
$a
和 ${a}
指的是同一个变量,但后者可以将其与以下文本分隔开来。使我能够使示例 3 输出 "a1"
而不是“k”的东西。
JavaScript 正则表达式引擎假定 $
之后的最长数字序列是要引用的组 ID,前提是模式中存在这样的组,因此 1
将引用组如果模式中有一个,则为 111,如果有第 11 组,则为第 11 组和 1
,如果少于 11 个组,则为第 1 组和 11
。如果根本没有组(即 "x".replace(/./g, "")
returns </code>),它将作为文字字符串返回。</p>
<p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>console.log('abcdefghijklmnopqrstuvwxyz'.replace(/^(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)$/, '')); // => "k"
console.log('abcdefghijklmnopqrstuvwxyz'.replace(/^(.)(.)(.)(.)(.)(.)(.)(.)(.).................$/, '')); // => "a1"
这一定已经有答案了,但我什至不知道要搜索什么。
在 JavaScript 中,我可以在替换字符串中引用带括号的子匹配,如下所示:
"abcdefghijklmnopqrstuvwxyz".replace(/(.)/g, "-");
// Result: "a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-"
现在,我想在每个字母之间放置一个 1
而不是 -
:
"abcdefghijklmnopqrstuvwxyz".replace(/(.)/g, "");
// Result: "a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t1u1v1w1x1y1z1"
至少 Chromium 似乎检测到没有子匹配组 11,因此它将替换字符串解释为“子匹配组 1 后跟一个 1”。
我们假设有 11 个组:
'abcdefghijklmnopqrstuvwxyz'.replace(/^(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)$/, '');
// Result: "k"
我想知道的:
- 示例 2 可以跨浏览器运行吗?它是否在某个地方定义了它应该像这样的行为?
- 有没有办法明确界定子匹配组引用?类似于 bash 中的内容,其中
$a
和${a}
指的是同一个变量,但后者可以将其与以下文本分隔开来。使我能够使示例 3 输出"a1"
而不是“k”的东西。
JavaScript 正则表达式引擎假定 $
之后的最长数字序列是要引用的组 ID,前提是模式中存在这样的组,因此 1
将引用组如果模式中有一个,则为 111,如果有第 11 组,则为第 11 组和 1
,如果少于 11 个组,则为第 1 组和 11
。如果根本没有组(即 "x".replace(/./g, "")
returns </code>),它将作为文字字符串返回。</p>
<p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>console.log('abcdefghijklmnopqrstuvwxyz'.replace(/^(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)$/, '')); // => "k"
console.log('abcdefghijklmnopqrstuvwxyz'.replace(/^(.)(.)(.)(.)(.)(.)(.)(.)(.).................$/, '')); // => "a1"