Подтвердить что ты не робот

Используйте динамическую (переменную) строку как шаблон регулярного выражения в JavaScript

Я хочу добавить (переменный) тег в значения с регулярным выражением, шаблон отлично работает с PHP, но у меня есть проблемы с его внедрением в JavaScript.

Шаблон (value является переменной):

/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is

Я избежал обратных косых черт:

var str = $("#div").html();
var regex = "/(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b/is";
$("#div").html(str.replace(regex, "<a href='#" + value +">" + value + "</a>"));

Но это кажется неправильным, я зарегистрировал шаблон и его то, что должно быть. Любые идеи?

4b9b3361

Ответ 1

Чтобы создать регулярное выражение из строки, вы должны использовать объект JavaScript RegExp.

Если вы также хотите сопоставить/заменить более одного раза, не забудьте добавить флаг g (глобальное совпадение). Вот пример:

var stringToGoIntoTheRegex = "abc";
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

JSFiddle здесь.


В общем случае экранируйте строку перед использованием в качестве регулярного выражения:

Однако не каждая строка является допустимым регулярным выражением: есть некоторые специальные символы, такие как ( или [. Чтобы обойти эту проблему, просто экранируйте строку, прежде чем превратить ее в регулярное выражение. Служебная функция для этого представлена в следующем примере:

function escapeRegExp(stringToGoIntoTheRegex) {
    return stringToGoIntoTheRegex.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

JSFiddle здесь.



Примечание: регулярное выражение в вопросе использует модификатор s, которого на момент вопроса не было, , но существует - флаг/модификатор s (dotall) в JavaScript - сегодня.

Ответ 2

Если вы пытаетесь использовать значение переменной в выражении, вы должны использовать конструктор RegExp.

var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")

Ответ 3

Я нашел эту нить полезной - поэтому я подумал, что добавлю ответ на свою собственную проблему.

Мне нужно было отредактировать файл конфигурации базы данных (datastax cassandra) из приложения node в javascript и для одного из параметров в файле, который мне нужно совместить по строке, а затем заменить строку, следующую за ней.

Это было мое решение.

dse_cassandra_yaml='/etc/dse/cassandra/cassandra.yaml'

// a) find the searchString and grab all text on the following line to it
// b) replace all next line text with a newString supplied to function
// note - leaves searchString text untouched
function replaceStringNextLine(file, searchString, newString) {
fs.readFile(file, 'utf-8', function(err, data){
if (err) throw err;
    // need to use double escape '\\' when putting regex in strings !
    var re = "\\s+(\\-\\s(.*)?)(?:\\s|$)";
    var myRegExp = new RegExp(searchString + re, "g");
    var match = myRegExp.exec(data);
    var replaceThis = match[1];
    var writeString = data.replace(replaceThis, newString);
    fs.writeFile(file, writeString, 'utf-8', function (err) {
    if (err) throw err;
        console.log(file + ' updated');
    });
});
}

searchString = "data_file_directories:"
newString = "- /mnt/cassandra/data"

replaceStringNextLine(dse_cassandra_yaml, searchString, newString );

После запуска он изменит существующий каталог данных на новый:

файл конфигурации до:

data_file_directories:  
   - /var/lib/cassandra/data

файл конфигурации после:

data_file_directories:  
- /mnt/cassandra/data

Ответ 4

Вам не нужно ", чтобы определить регулярное выражение так:

var regex = /(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is; // this is valid syntax

Если value - переменная, и вы хотите динамическое регулярное выражение, вы не можете использовать это обозначение; используйте альтернативные обозначения.

String.replace также принимает строки как входные данные, поэтому вы можете сделать "fox".replace("fox", "bear");

Альтернатива:

var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(.*?)\b/", "is");

Имейте в виду, что если value содержит символы регулярных выражений, такие как (, [ и ?, вам нужно будет их избежать.

Ответ 5

var string = "Hi welcome to stack overflow"
var toSearch = "stack"

//case insensitive search

var result = string.search(new RegExp(toSearch, "i")) > 0 ? 'Matched' : 'notMatched'

https://jsfiddle.net/9f0mb6Lz/

Надеюсь это поможет

Ответ 6

Я обнаружил, что мне пришлось удвоить \b, чтобы он заработал. Например, чтобы удалить слова "1x" из строки, используя переменную, мне нужно было использовать:

    str = "1x";
    var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
    inv=inv.replace(regex, "");