6

我有很多模板利用 mustache 标签来确定放置用户数据的位置。这些模板存储为字符串。

当我在 mustache 中调用 render 函数时,我输入了一个复杂的 JSON 对象,其中包含许多字符串和子文档的数组。

我在 mustache 标记中错误地声明使用数组中的特定元素,如下所示:

{{dataElementArray[2].subElement}}
{{anotherElement.dataArray[1]}}

相反,我想将每个模板中的所有出现更改为正确的小胡子语法,以解决如下元素:

{{dataElementArray.2.subElement}}
{{anotherElement.dataArray.1}}

系统地浏览每个模板(表示为字符串)并使用正则表达式更改每个标签中的内容的最佳方法是什么?我有 50 多个模板,其中大多数有数百行长,每个模板中有数百个标签。

我正在为这个应用程序使用 JavaScript/Node.js。

4

2 回答 2

6

对于单个正则表达式来说,这是一项艰巨(但并非不可能)的任务。幸运的是,我们没有理由只用一个。一个更简单(也更健壮)的方法是使用两个正则表达式:一个匹配替换标签(包含在 中的东西{{curly brackets}}),另一个用点索引器替换数组索引器的实例。这是我的解决方案:

s.replace( /\{\{(.*?)\}\}/g, function(x){          // this grabs replacement tags
  return x.replace( /\[(\d+)\]/g,'.$1' )});      // this replaces array indexers

注意:我没有使用整个 mustache 语法分析此解决方案,因此如果您使用的标签数量超过标准标签,我无法保证它会起作用。

于 2013-06-25T18:30:33.280 回答
3

描述

此表达式将匹配小胡子括号内的第一个方括号数字,它还验证方括号后跟一个点或小胡子括号。

使用这个正则表达式:(\{\{[a-z.]*[a-z])\[(\d+)\](?=\.|\})([a-z.]*\}\})

有了这个替换:$1.$2$3

在此处输入图像描述

Javascript代码示例:

http://www.myregextester.com/?r=f9e362af

样本输入

{{dataElementArray[2].subElement}}
{{anotherElement.dataArray[1]}}
{{alreadyFormatted.dataArray.1}}

代码

<script type="text/javascript">
  var re = /(\{\{[a-z.]*[a-z])\[(\d+)\](?=\.|\})([a-z.]*\}\})/;
  var sourcestring = "source string to match with pattern";
  var replacementpattern = "$1.$2$3";
  var result = sourcestring.replace(re, replacementpattern);
  alert("result = " + result);
</script>

更换后

{{dataElementArray.2.subElement}}
{{anotherElement.dataArray.1}}
{{alreadyFormatted.dataArray.1}}
于 2013-06-25T18:24:57.823 回答