关于正则表达式:如何系统地替换大部分文本中的胡子标记中的文本?

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。


这对于单个正则表达式而言是一项艰巨(但并非不可能)的任务。幸运的是,我们没有理由只做一个。一种更简单(且更可靠)的方法是使用两个正则表达式:一个用于匹配替换标记({{curly brackets}}中包含的内容),另一个用于使用点索引器替换数组索引器的实例。这是我的解决方案:

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

注意:我还没有使用整个胡须语法来分析此解决方案,因此,如果您使用的标准标签不多,我不能保证它会起作用。


描述

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

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

此替换:$1.$2$3

enter

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}}