现有的 JavaScript 框架中是否有非正则表达式的 replace()
函数,或者这种函数已经作为一次性函数发布在网络上了吗?
例如,我想替换"@!#$123=%"
,而不用担心需要转义哪些字符。大多数语言似乎都有两种方法可以进行替换操作。我希望看到这个简单的东西被添加进来。
现有的 JavaScript 框架中是否有非正则表达式的 replace()
函数,或者这种函数已经作为一次性函数发布在网络上了吗?
例如,我想替换"@!#$123=%"
,而不用担心需要转义哪些字符。大多数语言似乎都有两种方法可以进行替换操作。我希望看到这个简单的东西被添加进来。
我可能误解了你的问题,但是Javascript确实有一个replace()
方法。
var string = '@!#$123=%';
var newstring = string.replace('@!#$123=%', 'hi');
编辑:(请参见评论)第五版似乎确实包含此信息,尽管我直接链接时看不到它。 下面是相关部分:
replace() 方法执行搜索和替换操作。 它以一个正则表达式作为第一个参数,以一个替换字符串作为第二个参数。 它在被调用的字符串中搜索与指定模式匹配的内容。 如果正则表达式设置了 g 标志,则 replace() 方法将字符串中所有匹配项替换为替换字符串; 否则,它仅替换找到的第一次匹配。 如果 replace() 的第一个参数是字符串而不是正则表达式,则该方法按字面意义搜索该字符串,而不使用 RegExp() 构造函数将其转换为正则表达式,就像 search() 方法一样。
我曾经遇到过完全相同的问题,寻找一种非正则表达式的 JavaScript 字符串替换方法。我的解决方案是使用 split() 和 join() 的组合:
"some text containing regex interpreted characters: $1.00".split("$").join("£");
得到的结果如下:
"包含正则表达式解释字符的一些文本:£1.00"
与replace()进行比较:
"some text containing regex interpreted characters: $1.00".replace(new RegExp("$"),"£")
出现了一个奇怪的结果:
"一些包含正则表达式字符的文本:$1.00£"
replace()
简直是个笑话。感谢这个技巧,我认为这是最好的解决方案。+1 - user2173353RegExp("$")
匹配您的行尾是符合预期的。在将其发送到 RegExp 之前,您应该转义 $
:RegExp("\$")
。 - Yvans.split("$").join("£")
等同于s.replace(/\$/g, "£")
或s.replace(RegExp("\\$", "g"), "£")
。 - Bob Stein您仍然需要按照MDN上的指定,替换一些美元符号组合。
这将生成$bc
而不是$$bc
'abc'.replace('a', '$$')
不用担心这个问题的最好方法是使用替换函数:
'abc'.replace('a', () => '$$')
试试这个:
function replaceAllTemp(str,find, replace) {
var ignoreCase=true;
var _token;
var token=find;
var newToken=replace;
var i = -1;
if ( typeof token === "string" ) {
if ( ignoreCase ) {
_token = token.toLowerCase();
while( (
i = str.toLowerCase().indexOf(
token, i >= 0 ? i + newToken.length : 0
) ) !== -1
) {
str = str.substring( 0, i ) +
newToken +
str.substring( i + token.length );
}
} else {
return this.split( token ).join( newToken );
}
}
return str;
};
function replaceAll(str, find, newToken, ignoreCase)
{
var i = -1;
if (!str)
{
// Instead of throwing, act as COALESCE if find == null/empty and str == null
if ((str == null) && (find == null))
return newToken;
return str;
}
if (!find) // sanity check
return str;
ignoreCase = ignoreCase || false;
find = ignoreCase ? find.toLowerCase() : find;
while ((
i = (ignoreCase ? str.toLowerCase() : str).indexOf(
find, i >= 0 ? i + newToken.length : 0
)) !== -1
)
{
str = str.substring(0, i) +
newToken +
str.substring(i + find.length);
} // Whend
return str;
}
if (!String.prototype.replaceAll ) {
String.prototype.replaceAll = function (find, replace) {
var str = this, i = -1;
if (!str)
{
// Instead of throwing, act as COALESCE if find == null/empty and str == null
if ((str == null) && (find == null))
return newToken;
return str;
}
if (!find) // sanity check
return str;
ignoreCase = ignoreCase || false;
find = ignoreCase ? find.toLowerCase() : find;
while ((
i = (ignoreCase ? str.toLowerCase() : str).indexOf(
find, i >= 0 ? i + newToken.length : 0
)) !== -1
)
{
str = str.substring(0, i) +
newToken +
str.substring(i + find.length);
} // Whend
return str;
};
}
replace()
将字符串搜索值视为字符字面量。在这种情况下, "$" 不会被特殊处理。如果显式地调用了RegExp()
,那么与replace()
没有任何关系,因为一个 RegExp 对象被传递到replace()
,而不是一个字符串。 - bill.lee