Я хочу создать метод String.replaceAll()
в JavaScript и думаю, что использование regex было бы самым простым способом сделать это. Однако я не могу понять, как передать переменную в regex. Я уже могу сделать это, что заменит все экземпляры "B"
на "A"
.
"ABABAB".replace(/B/g, "A");
Но я хочу сделать что-то вроде этого:
String.prototype.replaceAll = function(replaceThis, withThis) {
this.replace(/replaceThis/g, withThis);
};
Но очевидно, что это заменит только текст "replaceThis"
... так как же мне передать эту переменную в мою строку regex?
Вместо того чтобы использовать синтаксис /regex/g
, вы можете построить новый объект RegExp:
var replace = "regex";
var re = new RegExp(replace,"g");
Вы можете динамически создавать объекты regex таким образом. Тогда вы получите:
"mystring".replace(re, "newstring");
Как Эрик Венделин сказано, вы можете сделать что-то вроде этого:
str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");
Это дает в "регулярное соответствие .&и"
. Однако, это не удастся, если str1 выглядит следующим образом в ".&и"
. Вы'd не ожидал, что результат будет в "Поиск по шаблону регулярного выражения"
в, заменив период с в "выражения"
В, но это'МР оказаться...
regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex
Это происходит потому, что, хотя в ".&и"
это строка, в конструкторе регулярных выражений она's по-прежнему интерпретируется как регулярное выражение, смысл любой он-лайн-сломать характер, что означает каждый символ в строке. Для этой цели, следующие функции могут быть полезны:
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
};
Тогда вы можете сделать:
str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");
уступая в "шаблону регулярного выражения"
в.
в
"ababab не то".заменить(/Б/г, "А");
Как всегда: Дон'т использовать regex, если вы не должны. Для простой строки заменить фразеологизм:
'ABABAB'.split('B').join('A')
Тогда вы не'т придется беспокоиться о цитировании вопросам, указанным в Gracenotes'ы ответ.
Для тех, кто хочет использовать переменную с Матч метод этот работал для меня
var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight
Это:
var txt=new RegExp(pattern,attributes);
эквивалентно этому:
var txt=/pattern/attributes;
Если вы хотите получить все вхождения (г
), регистру (я
), и границы использования, так что это'т слово в другое слово (\\B
с):
re = new RegExp(`\\b${replaceThis}\\b`, 'gi');
Пример:
let inputString = "I'm John, or johnny, but I prefer john.";
let replaceThis = "John";
let re = new RegExp(`\\b${replaceThis}\\b`, 'gi');
console.log(inputString.replace(re, "Jack")); // I'm Jack, or johnny, but I prefer Jack.
this.replace( new RegExp( replaceThis, 'g' ), withThis );
Вы хотите построить регулярное выражение динамически и для этого должных solutuion заключается в использовании нового регулярное выражение(строку) конструктор. Для того, для конструктора, для лечения специальные символы в буквальном смысле, вы должны избежать их. Существует встроенная функция в виджет jQuery пользовательского интерфейса автозаполнение под названием $.пользовательского интерфейса.автозаполнение.escapeRegex
:
[...] вы можете использовать встроенный
$.пользовательского интерфейса.автозаполнение.функция escapeRegex
. Это'll принять одну строку аргумент и вы все regex символов, делая в итоге безопасно пропуск в новое регулярное выражение()`.
Если вы с помощью jQuery UI вы можете использовать эту функцию, или скопировать его определение от источника:
function escapeRegex( value ) {
return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}
И использовать его как это:
"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
// escapeRegex("[z-a]") -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result -> "[a-z][a-z][a-z]"
String.prototype.replaceAll = function (replaceThis, withThis) {
var re = new RegExp(replaceThis,"g");
return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");
Тест с этой инструмент
String.prototype.replaceAll = function(a, b) {
return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}
Проверить его как:
var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'
console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))
Здесь's другое внедрение заменяет:
String.prototype.replaceAll = function (stringToFind, stringToReplace) {
if ( stringToFind == stringToReplace) return this;
var temp = this;
var index = temp.indexOf(stringToFind);
while (index != -1) {
temp = temp.replace(stringToFind, stringToReplace);
index = temp.indexOf(stringToFind);
}
return temp;
};
И в CoffeeScript версия Стивен Пенни'ы ответьте, так как это #2 Google в результате....даже если кофе-это просто JavaScript с множеством героев убрали...;)
baz = "foo"
filter = new RegExp(baz + "d")
"food fight".match(filter)[0] // food
и в моем конкретном случае
robot.name=hubot
filter = new RegExp(robot.name)
if msg.match.input.match(filter)
console.log "True!"
Чтобы удовлетворить мои потребности, чтобы вставить переменную функции/псевдоним/в регулярное выражение, это то, что я придумал:
oldre = /xx\(""\)/;
function newre(e){
return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g")
};
String.prototype.replaceAll = this.replace(newre(oldre), "withThis");
где 'oldre' - это оригинальный выражения, которую я хочу вставить переменную, 'ХХ' это заполнитель для этой переменной функции/псевдоним/, и 'ый' это фактическое имя переменной, псевдоним, или функция.
В то время как вы можете сделать динамически создается регулярное выражение'ы (как в других ответах на этот вопрос), Я'МР Эхе мой комментарий от подобный пост: функциональные формы строка.заменить() является чрезвычайно полезным и во многих случаях снижает необходимость динамически созданных объектов regexp. (что-то вроде занозы 'вызвать вас есть, чтобы выразить на вход регулярное выражение конструктор как строка, а не использовать слеши /[а-я]+/ регулярное выражение буквальное формат)
Вы всегда можете использовать помощи indexOf
повторно:
String.prototype.replaceAll = function(substring, replacement) {
var result = '';
var lastIndex = 0;
while(true) {
var index = this.indexOf(substring, lastIndex);
if(index === -1) break;
result += this.substring(lastIndex, index) + replacement;
lastIndex = index + substring.length;
}
return result + this.substring(lastIndex);
};
Это не войти в бесконечный цикл, когда на замену содержится матча.
Ваше решение здесь:
Передать переменную в регулярное выражение.
Тот, который я реализовал это путем деления значения из текстового поля, которое вы хотите заменить, а другой в "заменить на" текстовое поле получает значение из текстового поля в переменную и параметр переменную в регулярное выражение функции, чтобы в дальнейшем заменить. В моем случае я с помощью jQuery, Вы тоже можете это сделать только на JavaScript.
Код JavaScript:
var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace
var replace_with = document.getElementById("with"); //Getting the value from another text fields with which I want to replace another string.
var sRegExInput = new RegExp(replace, "g");
$("body").children().each(function() {
$(this).html($(this).html().replace(sRegExInput,replace_with));
});
Этот код на событие onclick кнопки, вы можете поместить это в функцию вызова.
Так что теперь вы можете передать переменную в функции замены.
Вы можете использовать это, если $1 не работать с вами
var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");
Ни один из этих ответов мне были понятны. В итоге я нашла хорошее объяснение в http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/
Ответ прост:
var search_term = new RegExp(search_term, "g");
text = text.replace(search_term, replace_term);
Например:
в
$("button").click(function() {
Find_and_replace("Lorem", "Chocolate");
Find_and_replace("ipsum", "ice-cream");
});
function Find_and_replace(search_term, replace_term) {
text = $("textbox").html();
var search_term = new RegExp(search_term, "g");
text = text.replace(search_term, replace_term);
$("textbox").html(text);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textbox>
Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum
</textbox>
<button>Click me</button>
в