How do I systematically replace text within mustache tags in a large body of text?
我有很多模板,这些模板利用胡须标签来确定将用户数据放置在何处。这些模板存储为字符串。
当我在小胡子内调用render函数时,我将输入一个复杂的JSON对象,该对象包含许多由字符串和子文档组成的数组。
我在mustache标签中错误地声明要使用数组中的特定元素,例如:
1 2 | {{dataElementArray[2].subElement}} {{anotherElement.dataArray[1]}} |
相反,我想将每个模板中的所有匹配项更改为适当的小胡子语法,以解决诸如此类的元素:
1 2 | {{dataElementArray.2.subElement}} {{anotherElement.dataArray.1}} |
系统地浏览每个模板(以字符串表示)并使用正则表达式更改每个标记中的内容的最佳方法是什么?我有50多个模板,其中大多数模板长达数百行,每个模板中包含数百个标签。
我正在为此应用程序使用JavaScript / Node.js。
这对于单个正则表达式而言是一项艰巨(但并非不可能)的任务。幸运的是,我们没有理由只做一个。一种更简单(且更可靠)的方法是使用两个正则表达式:一个用于匹配替换标记(
1 2 | s.replace( /\\{\\{(.*?)\\}\\}/g, function(x){ // this grabs replacement tags return x.replace( /\\[(\\d+)\\]/g,'.$1' )}); // this replaces array indexers |
注意:我还没有使用整个胡须语法来分析此解决方案,因此,如果您使用的标准标签不多,我不能保证它会起作用。
描述
此表达式将匹配小胡子括号内的第一个方括号数字,它还验证了方括号后跟一个圆点或闭合的小胡子括号。
使用此正则表达式:
此替换:
JavaScript代码示例:
http://www.myregextester.com/?r=f9e362af
样本输入
1 2 3 | {{dataElementArray[2].subElement}} {{anotherElement.dataArray[1]}} {{alreadyFormatted.dataArray.1}} |
代码
1 2 3 4 5 6 | <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); |
更换后
1 2 3 | {{dataElementArray.2.subElement}} {{anotherElement.dataArray.1}} {{alreadyFormatted.dataArray.1}} |