奇怪的JavaScript正则表达式替换问题
Weird javascript regexp replace issue
我有以下文字
text(-) 3
我想改成:
-3
所以我写了下面的正则表达式:
'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);
演示 - 这不起作用。
但是,当我执行以下操作时
var output = 'text(-) 3'.replace(/text'(([^')]+)')/g, RegExp.$1);
output = 'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);
(所以首先我删除了?:
(它可以工作
演示
因此,我一定错过了使用正则表达式对匹配进行分组(或者只是愚蠢的东西(的东西。任何帮助将不胜感激!?
代码说明
删除?:
会使组捕获,这意味着它将捕获与[^')]+
匹配的任何内容,并且匹配的文本可用于替换和反向引用。
var output = 'text(-) 3'.replace(/text'(([^')]+)')/g, RegExp.$1);
调用 String.replace
时,RegExp.$1
尚未初始化,因此输出中的结果将" 3"
。然后执行正则表达式,捕获组捕获-
text(-)
并将其放置在捕获组 1 中。
已弃用的属性RegExp.$1
也会使用上次执行RegExp
的捕获组 1 的内容进行更新。
然后在下一行:
output = 'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);
由于RegExp.$1
现在包含"-"
,替换给出的结果"- 3"
。
RegExp.$1
已被弃用,因为它在所有RegExp
执行和极易出错的执行之间共享。RegExp.$2
RegExp.$9
的一堆其他属性也是如此,其中包含最新执行的捕获组 2 到 9 的内容。
溶液
为了您的目的,您应该这样做:
var output = 'text(-) 3'.replace(/text'(([^')]+)') */g, "$1");
不清楚)
后有多少空格,所以我添加了 *
。若要在替换中引用捕获组的内容,请在替换字符串中使用$1
。
您可能正在寻找
var output = 'text(-) 3'.replace(/text'(([^')]+)')/g, '$1');
小提琴演示
'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);
问题
(?:[^')]+)
是非捕获组,因此不会在$1
中捕获值RegExp.$1
包含来自上一个正则表达式匹配项的捕获组,而不是当前正则表达式匹配项那是
var output = 'text(-) 3'.replace(/text'(([^')]+)')/g, RegExp.$1); output = 'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);
在第二条语句中,正则表达式
RegExp.$1
来自第一条语句,而不是来自第二条语句。因此,单独使用时,它是未设置的,不会创建预期的输出。
- 将“提示”对话框中的输入替换为星号时出现问题
- '对于'循环,替换span标记的问题
- 此nodeValue替换代码有什么问题
- 替换
元素中的特殊字符的问题
- jQuery-图像替换转换〔Safari中的问题〕
- Javascript将问题替换为$
- JavaScript将问题替换为“;垂直条”;
- SJCL的问题“;无法读取属性'替换'“未定义”;
- 用链接 JavaScript 替换 HTML 的问题
- 替换 URL 字符串中的撇号时出现问题
- Javascript替换方法有什么问题
- 是否存在替换Javascript构造函数的问题'原型,而不是添加到原型中
- 调整图像大小以使其完美地适合幻灯片,问题仍然是用 for 循环将 CSS 代码替换为我的图像
- 正则表达式替换问题
- 奇怪的JavaScript正则表达式替换问题
- jquery替换问题
- JavaScript变量替换问题
- 特殊字符导致JS替换问题
- javascript替换问题
- JS小文本替换问题