Замена 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;
};
}