0

我正在填充存储在数组中的变量的开始部分

disp_var_name = []; //contains elements: a, b, g, c, f, salary, d, e;

fText = "(b>0&& ( salary > 33.00 ) )"

for(var pp=0; pp<disp_var_name.length; pp++){
   fText = fText.replace(disp_var_name[pp], "_sc_"+disp_var_name[pp]);
}
alert(fText);

的值fText应该是(_sc_b>0&& ( _sc_salary > 33.00 ) )但它显示(_sc_b>0&& ( _sc_alary > 33.00 ) )

怎么了?我应该如何做对?

我正在开发一个像 c++ 到 js 转换器这样的系统。我正在填充它,_sc_以便 sc(源代码)中的变量与系统变量隔离。

4

1 回答 1

0

您的 for 循环disp_var_name按顺序遍历数组,替换每个指定字符串的第一次出现。所以它做的第一件事就是找到“a”并用“_sc_a”替换它,这会给你:

(b>0&& ( s_sc_alary > 33.00 ) )

然后它替换了“b”,它为您提供:

(_sc_b>0&& ( s_sc_alary > 33.00 ) )

它寻找一个“g”,但在继续替换第一个“c”之前没有找到一个:

(_s_sc_c_b>0&& ( s_sc_alary > 33.00 ) )

没有“f”,“salary”由于之前的替换而不再存在,也没有“g”,所以结果是:

(_s_sc_c_b>0&& ( s_sc_alary > 33.00 ) )

如果您使用知道单词边界的正则表达式,它将起作用:

fText = fText.replace(new RegExp("\\b"+disp_var_name[pp]+"\\b", "g"), "_sc_"+disp_var_name[pp]);

这使您可以根据正则表达式模式\ba\b,等进行替换。我显示的代码中\bb\b的双精度是因为如果在字符串中提供,则需要对其进行转义。\\\

请注意,如果您将设置了(全局)标志.replace()的正则表达式传递给它,则唯一会进行全局替换;g如果您将字符串或正则表达式传递给它,则g它只会替换第一次出现。

于 2013-09-22T00:16:31.670 回答