Замена JavaScript без переопределения

В какой-либо из существующих фреймворков JavaScript есть функция non-regex replace() или это уже было опубликовано в Интернете где-то в качестве одноразовой функции?

Например, я хочу заменить "@!#$123=%", и я не хочу беспокоиться о том, какие символы должны уходить. У большинства языков, как представляется, есть оба метода замены. Я бы хотел, чтобы эта простая вещь была добавлена.

Ответ 1

Возможно, я не понимаю ваш вопрос, но у javascript есть replace()

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

edit: (см. комментарии) 5-е издание, похоже, содержит эту информацию, хотя оно не отображается, когда я напрямую. здесь соответствующая часть:

Метод replace() выполняет операцию поиска и замены. Он принимает регулярное выражение как его первый аргумент и заменяющую строку в качестве второго аргумента. Он ищет строку, на которую он вызывается для совпадений с указанным шаблоном. Если в регулярном выражении установлен флаг g, метод replace() заменяет все совпадения в строке заменяющей строкой; в противном случае он заменяет только первое найденное совпадение. Если первый аргумент replace() является строкой, а не регулярным выражением, метод ищет эту строку буквально, а не преобразовывает ее в регулярное выражение с помощью конструктора RegExp(), как это делает search().

Ответ 2

У меня была точно такая же проблема с поиском метода replace() метода non-regex javascript string. Мое решение состояло в использовании комбинации 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("$"),"£")

который причудливо дает:

"некоторый текст, содержащий интерпретируемые символы regex: $1.00 £"

Ответ 3

Попробуйте следующее:

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

Ответ 4

Вы можете сделать это с или без учета чувствительности к регистру.
К сожалению, 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;
};
}