regex 处理和替换双花括号内的文本

bsxbgnwa  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(166)

我有一个URL字符串:
var url = https://url.com/{{query}}/foo/{{query2}}
我有一行代码,可以接受一个字符串,然后得到一个包含大括号内所有查询的数组:
var queries = String(url).match(/[^{\}]+(?=})/g);
返回:queries = ['query', 'query2']
我有一个函数parse(queries),它处理这些查询并返回结果列表:
results = ['resultOfQuery', 'resultOfQuery2']
我希望能够接受这个列表,然后用它们的结果替换URL字符串中的查询。这个例子的最终结果是:
url = https://url.com/resultOfQuery/foo/resultOfQuery2
我有两个不同的问题:

  1. String.match代码行中的正则表达式只对一组花括号{something}计数。我如何修改它以查找一组双花括号{{something}}?
    1.我已经有了结果数组。什么是最好的方法来做字符串替换,使查询和它们的每个伴随的双括号集被替换为相应的结果?
z5btuh9x

z5btuh9x1#

你可以用下面的模式替换,

{{(.+?)}}
  • {{-匹配{{
  • (.+?)-一次或多次匹配除换行符以外的任何内容
let url = "https://url.com/{{query}}/foo/{{query2}}"

let result = {'query': 'queryResult1', 'query2':'queryResult2' }

let replaceDoubleBraces = (str,result) =>{
  return str.replace(/{{(.+?)}}/g, (_,g1) => result[g1] || g1)
}

console.log(replaceDoubleBraces(url,result))

注意:-我在这里使用result作为对象,这样查找和替换值就变得容易了,如果你可以改变你的解析函数,考虑从解析返回一个对象

tf7tbtn2

tf7tbtn22#

通用的解决方案,也将与嵌套对象。

function replaceText(text, obj, start = '{{', end = '}}') {
  return text.replace(new RegExp(`${start}(.+?)${end}`, 'g'), (_, part) => {
    return part.split('.')
      .reduce((o, k) => (
        o || {}
      )[k], obj);
  });
}

console.log(replaceText(
  'Hello my name is {{name.first}} {{name.last}}, age: {{age}}',
  {
    name: {
      first: 'first', last: 'last'
    },
    age: 20,
  }
));

使用Regex内置符号作为模板,在每个字符前使用双反斜杠\\。这是因为上面的函数使用模板字符串new RegExp('\\^(.+?)\\^', 'g')而不是RegExp构造函数new RegExp(/\^(.+?)\^/g)来创建正则表达式,否则单反斜杠就足够了。
举个例子

(  => \\(
)  => \\)
(( => \\(\\(
)) => \\)\\)
^  => \\^
mklgxw1f

mklgxw1f3#

另一个简单的方法是:

const string = "Hello {{world}}";

console.log(string.replace(/{{.*}}/, "Stack Overflow"));

相关问题