我有很多模板利用小胡子标签来确定放置用户数据的位置。这些模板存储为字符串。
当我在胡子中调用渲染函数时,我会输入一个复杂的JSON对象,该对象包含许多字符串和子文档的数组。
我在mustache标记中错误地声明要使用数组中的特定元素,如下所示:
{{dataElementArray[2].subElement}}
{{anotherElement.dataArray[1]}}
相反,我想将每个模板中的所有实例更改为适当的胡须语法,以便像这样寻址元素:
{{dataElementArray.2.subElement}}
{{anotherElement.dataArray.1}}
系统地浏览每个模板(表示为字符串)并使用正则表达式更改每个标记中的内容的最佳方法是什么?我有超过50个模板,其中大多数是数百行,每个模板中有数百个标签。
我在这个应用程序中使用JavaScript / Node.js.
答案 0 :(得分:5)
这对于单个正则表达式来说是一项艰巨的(但并非不可能)任务。幸运的是,我们没有理由只用一个。一种更容易(也更强大)的方法是使用两个正则表达式:一个匹配替换标记({{curly brackets}}
中包含的内容),另一个用点索引器替换数组索引器的实例。这是我的解决方案:
s.replace( /\{\{(.*?)\}\}/g, function(x){ // this grabs replacement tags
return x.replace( /\[(\d+)\]/g,'.$1' )}); // this replaces array indexers
注意:我没有使用entire mustache syntax分析此解决方案,因此如果您使用的标准代码超过标准代码,我无法保证它会有效。
答案 1 :(得分:1)
此表达式将匹配小胡子括号内的第一个方括号内的数字,它还验证方括号后跟一个点或关闭小胡子括号。
使用此正则表达式:(\{\{[a-z.]*[a-z])\[(\d+)\](?=\.|\})([a-z.]*\}\})
使用此替换:$1.$2$3
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}}