我填充存储在数组
中的变量的开头部分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(源代码)中的变量与系统的变量隔离。
答案 0 :(得分: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”,“薪水”因为之前的替换而不再存在,并且没有“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
的字符串或正则表达式,它只是替换第一次出现。