Как вы используете переменную в регулярном выражении?

Я хотел бы создать метод 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

Ответ 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>