【发布时间】:2008-11-13 21:22:21
【问题描述】:
任何现有的 JavaScript 框架是否有非正则表达式 replace() 函数,
还是已经将其作为一次性功能发布在网络上的某个地方?
例如我想替换"@!#$123=%" 并且我不想担心要转义哪些字符。大多数语言似乎都有两种替换方法。我希望看到添加这个简单的东西。
【问题讨论】:
标签: javascript
任何现有的 JavaScript 框架是否有非正则表达式 replace() 函数,
还是已经将其作为一次性功能发布在网络上的某个地方?
例如我想替换"@!#$123=%" 并且我不想担心要转义哪些字符。大多数语言似乎都有两种替换方法。我希望看到添加这个简单的东西。
【问题讨论】:
标签: javascript
您仍然需要替换MDN 中指定的几个美元符号组合。
这会产生$bc 而不是$$bc
'abc'.replace('a', '$$')
不用担心的最好方法是使用函数replace:
'abc'.replace('a', () => '$$')
【讨论】:
我可能误解了你的问题,但 javascript 确实有一个 replace()
var string = '@!#$123=%';
var newstring = string.replace('@!#$123=%', 'hi');
edit:(参见 cmets)第 5 版似乎确实包含此信息,尽管当我 link directly 时它并没有显示出来。这是相关部分:
replace() 方法执行搜索和替换操作。它将正则表达式作为第一个参数,将替换字符串作为第二个参数。它在调用它的字符串上搜索与指定模式匹配的字符串。如果正则表达式设置了 g 标志,则 replace() 方法将字符串中的所有匹配项替换为替换字符串;否则,它只替换它找到的第一个匹配项。 如果 replace( ) 的第一个参数是字符串而不是正则表达式,则该方法会按字面意思搜索该字符串,而不是像 search( ) 那样使用 RegExp( ) 构造函数将其转换为正则表达式。强>
【讨论】:
replace() 将 string 搜索值视为文字字符串。在这种情况下,“$”没有被特殊对待。如果显式调用了RegExp(),则与replace() 无关,因为将RegExp 对象传递给replace(),而不是字符串。
试试这个:
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;
};
【讨论】:
无论是否区分大小写,您都可以这样做。
可悲的是,JavaScript 的 indexOf 不会将语言环境与不变量作为参数,因此如果您想保留文化特异性,则必须将 toLowerCase 替换为 toLocaleLowerCase。
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;
};
}
【讨论】:
我在搜索非正则表达式 javascript 字符串 replace() 方法时遇到了完全相同的问题。我的解决方案是使用 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
RegExp("$") 没有什么奇怪的,它与预期的行尾匹配。在将美元发送到 RegExp 之前,您应该已经将其转义:RegExp("\$")
s.split("$").join("£") 等价于s.replace(/\$/g, "£") 或s.replace(RegExp("\\$", "g"), "£")。