如何系统地替换大量文本中的胡须标签中的文本?

时间:2013-06-25 18:12:11

标签: regex node.js mustache

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

当我在胡子中调用渲染函数时,我会输入一个复杂的JSON对象,该对象包含许多字符串和子文档的数组。

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

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

相反,我想将每个模板中的所有实例更改为适当的胡须语法,以便像这样寻址元素:

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

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

我在这个应用程序中使用JavaScript / Node.js.

2 个答案:

答案 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

enter image description here

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