JavaScript非正则表达式替换

20

现有的 JavaScript 框架中是否有非正则表达式的 replace() 函数,或者这种函数已经作为一次性函数发布在网络上了吗?

例如,我想替换"@!#$123=%",而不用担心需要转义哪些字符。大多数语言似乎都有两种方法可以进行替换操作。我希望看到这个简单的东西被添加进来。

5个回答

31

我可能误解了你的问题,但是Javascript确实有一个replace()方法。

var string = '@!#$123=%';
var newstring = string.replace('@!#$123=%', 'hi');

编辑:(请参见评论)第五版似乎确实包含此信息,尽管我直接链接时看不到它。 下面是相关部分:

replace() 方法执行搜索和替换操作。 它以一个正则表达式作为第一个参数,以一个替换字符串作为第二个参数。 它在被调用的字符串中搜索与指定模式匹配的内容。 如果正则表达式设置了 g 标志,则 replace() 方法将字符串中所有匹配项替换为替换字符串; 否则,它仅替换找到的第一次匹配。 如果 replace() 的第一个参数是字符串而不是正则表达式,则该方法按字面意义搜索该字符串,而不使用 RegExp() 构造函数将其转换为正则表达式,就像 search() 方法一样。


可能我看的是一份旧版本的《JavaScript权威指南》,只展示了正则表达式的例子,所以从未尝试过上述代码。现在我感到有些愚蠢。-10个酷点给我。 - BuddyJoe
有人可以检查一下《JavaScript权威指南》的最新版本吗?这种类型的示例现在是否已包含在内? - BuddyJoe
3
Nick的下面的回答对于“不使用正则表达式”的选项更加可靠,因为本地的replace方法在替换字符串中使用特殊字符。因此,虽然用'hi'替换文本是可以的,但是用任何包含'$'的内容进行替换可能会导致意外结果。尝试使用"a".replace("a","$$b")作为示例 :) - Simon Francesco
14
JavaScript函数仅替换第一个匹配项。 - Steven Lizarazo
这个答案完美地回答了 OP 的问题。关键在于 replace() 将字符串搜索值视为字符字面量。在这种情况下, "$" 不会被特殊处理。如果显式地调用了 RegExp(),那么与 replace() 没有任何关系,因为一个 RegExp 对象被传递到 replace(),而不是一个字符串。 - bill.lee

23

我曾经遇到过完全相同的问题,寻找一种非正则表达式的 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£"


在网上找不到足够的示例来展示简单的替换方法 - "some text containing regex interpreted characters: $1.00".replace("$","£")。 - BuddyJoe
这就是Web编程:不断重复造轮子。JavaScript的replace()简直是个笑话。感谢这个技巧,我认为这是最好的解决方案。+1 - user2173353
7
“$” 在正则表达式中表示行尾!因此,RegExp("$") 匹配您的行尾是符合预期的。在将其发送到 RegExp 之前,您应该转义 $RegExp("\$") - Yvan
1
注意:这将替换所有出现的内容。因此s.split("$").join("£")等同于s.replace(/\$/g, "£")s.replace(RegExp("\\$", "g"), "£") - Bob Stein

4

您仍然需要按照MDN上的指定,替换一些美元符号组合。

这将生成$bc而不是$$bc

'abc'.replace('a', '$$')

不用担心这个问题的最好方法是使用替换函数:

'abc'.replace('a', () => '$$')

这似乎是迄今为止最好、最简单的解决方案。它对我非常有效。谢谢。 - Audaxocles

4

试试这个:

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;
};

1
你可以使用大小写敏感或不敏感的方式来实现。不幸的是,JavaScript 的 indexOf 方法不支持区分语言环境和不变性作为参数,因此如果你想保留特定文化,请使用 toLocaleLowerCase 替换 toLowerCase。
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;
};
}

正则表达式提供了\b单词边界选项。是否有一种方法可以修改它,以便在下一个字符是字母数字时不进行替换? - Christopher Rucinski
将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文本,不要进行解释。 - Christopher Rucinski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接