Используйте динамическую (переменную) строку как шаблон регулярного выражения в 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>"));
Но это кажется неправильным, я зарегистрировал шаблон и его то, что должно быть.
Любые идеи?
Ответы
Ответ 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, "");