3 回答
TA贡献1798条经验 获得超3个赞
使用字符串文字,这很容易。
并不是的!该示例仅替换的第一个匹配项string_to_replace。通常,您希望替换所有出现的情况,在这种情况下,必须将字符串转换为全局(/.../g)RegExp。您可以使用new RegExp构造函数从字符串执行此操作:
new RegExp(string_to_replace, 'g')
这样做的问题是,字符串文字中的任何正则表达式特殊字符都将以其特殊方式运行,而不是普通字符。您必须反斜杠转义他们以解决此问题。不幸的是,没有内置函数可以为您执行此操作,因此您可以使用以下函数:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
还要注意,当您使用RegExp in时replace(),替换字符串现在也具有特殊字符$。如果要$在替换文本中包含文字,也必须对此进行转义!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(四个,$因为它本身就是一个替换字符串-啊!)
现在,您可以使用RegExp实现全局字符串替换:
function replace_foo(target, string_to_replace, replacement) {
var relit= escapeRegExp(string_to_replace);
var sub= escapeSubstitute(replacement);
var re= new RegExp(relit, 'g');
return target.replace(re, sub);
}
真痛苦 幸运的是,如果您要做的就是用正则字符串替换而无需使用正则表达式的其他部分,则有一种更快的方法:
s.split(string_to_replace).join(replacement)
...就这样。这是一个常见的成语。
说我想替换掉string_to_replace之外的所有东西
这是什么意思,您想替换所有不参与字符串匹配的文本?^当然用替换不是,因为这^意味着字符串开始标记,而不是取反。^只是[]字符组中的一个否定项。也有负面的前瞻性(?!...),但是JScript中存在一些问题,因此通常应避免使用它。
您可以尝试匹配字符串的“所有内容”,并使用函数丢弃匹配字符串之间的任何空字符串:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
再一次,拆分可能会更简单:
var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
if (parts[i]!=='')
parts[i]= replacement;
return parts.join(string_to_match);
TA贡献1851条经验 获得超3个赞
正如其他人所说,请使用new RegExp(pattern, flags)
此操作。值得注意的是,您将字符串文字传递给此构造函数,因此每个反斜杠都必须转义。例如,如果您想让正则表达式与反斜杠匹配new RegExp('\\\\')
,则需要说,而正则表达式的文字只需是/\\/
。根据您打算如何使用它,您应该警惕在没有适当的预处理(转义特殊字符等)的情况下将用户输入传递给该函数,否则,您的用户可能会得到一些非常意外的结果。
添加回答
举报