Существует более общее решение.
Прежде всего, как я уже упоминал в комментариях, вам не нужно использовать конструктор RegExp
, вы можете просто передать свое регулярное выражение между слешами и использовать флаги послепоследняя косая черта:
str.replace(/\$\(unique-result\)/g, "someValue")
Второй момент заключается в том, что String.prototype.replace
может принимать функцию в качестве второго параметра.Это будет полезно, когда в вашей строке много именованных шаблонов.Например, у вас есть следующая входящая строка:
var incomingString = "$(first-value) says $(second-value) when there is $(third-value)"
С кодом, который вы предоставили, вы должны позвонить replace
3 раза.Но если вы будете использовать функцию в качестве второго параметра, это можно упростить до:
var incomingString = "$(first-value) says $(second-value) when there is $(third-value)"
var data = {
"first-value": "Kappa",
"second-value": "Hey!",
"third-value": "GreyFaceNoSpace"
}
var resultString = incomingString.replace(/\$\(([^)]+)\)/g, (match, capture) => {
console.log(match, capture)
return data[capture]
})
console.log(resultString)
"ЧТО ПРОИСХОДИТ ЗДЕСЬ ?!"Вы, вероятно, спросите.Ничего сложного.
- Функция, передаваемая в качестве аргумента, принимает один или несколько аргументов: первый - полное совпадение, а остальные - захваченные группы.Он должен возвращать строку, которая должна заменить полное совпадение .
- В нашем регулярном выражении мы описали, что мы хотим сопоставить все возможные подстроки в формате
\$\(([^)]+)\)
, где [^)]+
относитсяна один или более из любых символов, кроме закрывающей скобки , и эта конструкция должна быть захвачена (она находится между несанезизированными скобками).
Итак, когда это регулярное выражение будет соответствовать, оно передаст всю конструкцию $(...)
в аргумент match
переданной функции, а имя шаблона в аргумент capture
.Так что capture
является нашим ключом для хранения некоторых данных, и мы просто возвращаем это значение в функцию.
Вот и все!Надеюсь, это будет полезно :) 1041 *