Как вы используете переменную в регулярном выражении?
Я хотел бы создать метод String.replaceAll()
в JavaScript, и я думаю, что использование регулярного выражения было бы наиболее кратким способом сделать это. Однако я не могу понять, как передать переменную в регулярное выражение. Я могу сделать это уже, что заменит все экземпляры "B"
на "A"
.
"ABABAB".replace(/B/g, "A");
Но я хочу сделать что-то вроде этого:
String.prototype.replaceAll = function(replaceThis, withThis) {
this.replace(/replaceThis/g, withThis);
};
Но очевидно, что это заменит только текст "replaceThis"
... так как мне передать эту переменную в мою строку регулярного выражения?
Ответы
Ответ 1
Вместо синтаксиса /regex/g
вы можете создать новый объект RegExp:
var replace = "regex";
var re = new RegExp(replace,"g");
Вы можете динамически создавать объекты регулярных выражений таким образом. Затем вы выполните:
"mystring".replace(re, "newstring");
Ответ 2
Как упоминал Эрик Венделин, вы можете сделать что-то вроде этого:
str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");
Это дает "regex matching ."
. Однако он будет терпеть неудачу, если str1 "."
. Вы ожидаете, что результат будет "pattern matching regex"
, заменив период на "regex"
, но он окажется...
regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex
Это потому, что, хотя "."
является строкой, в конструкторе RegExp он по-прежнему интерпретируется как регулярное выражение, что означает любой символ нестрочного разрыва, означающий каждый символ в строке. Для этой цели может быть полезной следующая функция:
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
};
Затем вы можете сделать:
str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");
дает "pattern matching regex"
.
Ответ 3
"ABABAB".replace(/B/g, "A");
Как всегда: не используйте регулярное выражение, если вам не нужно. Для простой замены строки идиома:
'ABABAB'.split('B').join('A')
Тогда вам не нужно беспокоиться о цитировании вопросов, упомянутых в ответе Gracenotes.
Ответ 4
Для тех, кто хочет использовать переменную с методом match, это сработало для меня
var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight
Ответ 5
Это:
var txt=new RegExp(pattern,attributes);
эквивалентно этому:
var txt=/pattern/attributes;
См. http://www.w3schools.com/jsref/jsref_obj_regexp.asp.
Ответ 6
Если вы хотите получить ВСЕ вхождения (g
), нечувствительны к регистру (i
) и используйте границы, чтобы это не было слово в другом слове (\\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.
Ответ 7
this.replace( new RegExp( replaceThis, 'g' ), withThis );
Ответ 8
Вы хотите построить регулярное выражение динамически, и для этого правильным решением будет использование конструктора new RegExp(string)
. Чтобы конструктор обрабатывал специальные символы буквально, вы должны избегать их. В виджете автозаполнения пользовательского интерфейса jQuery есть встроенная функция под названием $.ui.autocomplete.escapeRegex
:
[...] вы можете использовать встроенный Функция $.ui.autocomplete.escapeRegex
. Это займет одну строку аргумент и экранировать все символы регулярного выражения, делая результат безопасным для перейти к new RegExp()
.
Если вы используете пользовательский интерфейс jQuery, вы можете использовать эту функцию или скопировать ее определение из источника:
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]"
Ответ 9
String.prototype.replaceAll = function (replaceThis, withThis) {
var re = new RegExp(replaceThis,"g");
return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");
Протестируйте с помощью tool
Ответ 10
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("]", ">"))
Ответ 11
Здесь другая реализация replaceAll:
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;
};
Ответ 12
И версия кофейня Стивена Пенни ответит, так как это результат №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!"
Ответ 13
Пока вы можете создать динамически созданный RegExp (как и другие ответы на этот вопрос), я отправлю комментарий из аналогичного сообщения: Функциональная форма String.replace() чрезвычайно полезен и во многих случаях уменьшает потребность в динамически создаваемых объектах RegExp. (которые являются своего рода болью, потому что вам нужно выразить ввод конструктору RegExp как строку, а не использовать листы слэшей /[A-Z] +/regexp)
Ответ 14
Чтобы удовлетворить мою потребность вставить переменную/псевдоним/функцию в регулярное выражение, вот что я придумал:
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" - это исходное регулярное выражение, которое я хочу вставить в переменную,
"xx" является заполнителем этой переменной/псевдонима/функции,
и 'yy' - это фактическое имя переменной, псевдоним или функция.
Ответ 15
Вы можете использовать это, если $1 не работает с вами
var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");
Ответ 16
Вы всегда можете использовать 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);
};
Это не входит в бесконечный цикл, когда замена содержит совпадение.
Ответ 17
Ваше решение здесь:
Передайте переменную в регулярное выражение.
Тот, который я реализовал, - это значение, полученное из текстового поля, которое вы хотите заменить, а другое - текстовым полем "заменить на", получая значение из текстового поля в переменной и устанавливая переменную в RegExp для дальнейшей замены. В моем случае я использую 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 кнопки, вы можете поместить его в функцию для вызова.
Итак, теперь вы можете передать переменную взамен функции.
Ответ 18
Для чрезвычайно простых запросов:
// dynamic query
const query = 'lo' // lets say its coming from an input field
// matching it with something
const doestItMatch = "Hello World!".indexOf(query) >= 0
// results
console.log(doesItMatch) // boolean result - true or false
Рабочий пример: filtering a list of items
// I can work with it in an array of "items" to filter the array
// the "query" variable is dynamic
const filteredItems = allItems.filter(item => item.text.indexOf(query) >= 0)
console.log(filteredItems) // will have an array of items that have a "text" key with a value that has the "query" somewhere it it.
Удачи.
Ответ 19
Ни один из этих ответов не был понятен мне. В конце концов я нашел хорошее объяснение на 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>