Скажем, я хотел сделать следующее многоразовым:
function replace_foo(target, replacement) {
return target.replace("string_to_replace",replacement);
}
Я мог бы сделать что-то вроде этого:
function replace_foo(target, string_to_replace, replacement) {
return target.replace(string_to_replace,replacement);
}
Со строковыми литералами это достаточно просто. Но что, если я хочу немного усложнить регулярное выражение? Например, сказать, что я хочу заменить все, кроме string_to_replace
. Инстинктивно я бы попытался расширить вышесказанное, выполнив что-то вроде:
function replace_foo(target, string_to_replace, replacement) {
return target.replace(/^string_to_replace/,replacement);
}
Это не похоже на работу. Я предполагаю, что он считает string_to_replace
строковый литерал, а не переменную, представляющую строку. Можно ли создавать регулярные выражения JavaScript на лету, используя строковые переменные? Примерно так было бы замечательно, если вообще возможно:
function replace_foo(target, string_to_replace, replacement) {
var regex = "/^" + string_to_replace + "/";
return target.replace(regex,replacement);
}
javascript
regex
buley
источник
источник
/
разделители регулярных выражений при использовании этой формы тоже.На самом деле, нет! Пример заменяет только первое вхождение
string_to_replace
. Чаще всего вы хотите заменить все вхождения, в этом случае вам нужно преобразовать строку в глобальный (/.../g
) RegExp. Вы можете сделать это из строки, используяnew RegExp
конструктор:Проблема в том, что любые специальные символы регулярных выражений в строковом литерале будут вести себя по-своему, а не как обычные символы. Вы должны были бы их убрать, чтобы это исправить. К сожалению, для этого нет встроенной функции, поэтому вы можете использовать ее:
Также обратите внимание, что когда вы используете RegExp
replace()
, строка замены теперь также имеет специальный символ$
. Этого также необходимо избежать, если вы хотите, чтобы$
в вашем тексте замены был литерал !(Четыре
$
с, потому что это сама строка замены - аааа!)Теперь вы можете реализовать глобальную замену строк с помощью RegExp:
Вот это боль. К счастью, если все, что вам нужно, это заменить строку без дополнительных частей регулярного выражения, есть более быстрый способ:
...и это все. Это общепринятая идиома.
Что это значит, вы хотите заменить все фрагменты текста, не участвуя в сопоставлении со строкой? Замена на
^
определенно не делает этого, потому что^
означает токен начала строки, а не отрицание.^
это только отрицание в[]
группах персонажей. Есть и негативные перспективы(?!...)
, но в JScript есть проблемы с этим, поэтому вам следует избегать этого.Вы можете попробовать сопоставить строку «все до» и использовать функцию, чтобы отбросить любое пустое натяжение между совпадающими строками:
Здесь, опять же, разделение может быть проще:
источник
Как уже говорили другие, используйте
new RegExp(pattern, flags)
для этого. Стоит отметить, что вы будете передавать строковые литералы в этот конструктор, поэтому каждый обратный слеш должен быть экранирован. Например, если вы хотите, чтобы ваше регулярное выражение совпадало с обратной косой чертой, вам нужно было бы сказатьnew RegExp('\\\\')
, тогда как литерал регулярного выражения должен был бы быть только таким/\\/
. В зависимости от того, как вы собираетесь использовать это, вам следует с осторожностью передавать пользовательский ввод в такую функцию без адекватной предварительной обработки (экранирование специальных символов и т. Д.). Без этого ваши пользователи могут получить очень неожиданные результаты.источник
/\b[term]\B/
, но при его создании мне нужно вызватьnew RegExp("\\b"+ term + "\\B")
. Небольшой , но важное различие, и трудно определить , так как использовать его в качестве регулярного выражения непосредственно делает работу , как и ожидалось.Да, ты можешь.
https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions
источник
Я думаю, у меня есть очень хороший пример для выделения текста в строке (он находит не глядя на регистр, но выделенный с помощью регистра)
http://jsfiddle.net/cdbzL/1258/
источник
Это действительно простое решение:
Нет необходимости в регулярных выражениях вообще
Это также, кажется, самый быстрый в современных браузерах https://jsperf.com/replace-vs-split-join-vs-replaceall
источник