模板处理,字符串重复{{repeat 5}}

时间:2017-01-30 11:20:18

标签: javascript regex string

我有以下案例

输入

var str = '{{repeat 2}} some string {{/repeat}}';

输出

str = 'some string, some string';

输入

var str = '{{repeat 2}}{"prop1":"some data"}{{/repeat}}';

输出

str = '{"prop1":"some data"}, {"prop1":"some data"}';

输入

var str = 'start of string {{repeat 2}} some string {{/repeat}} another string ';

输出

str = 'start of string some string, some string another string';

我想这样做

var test = "{{repeat 5}} test this string {{/repeat}}";
var arrStr = test.split(/[{{]/);

并通过循环arrStr

来处理此问题

还有其他好办法吗?如何在重复中找到重复计数和字符串的重复?

2 个答案:

答案 0 :(得分:1)

String.prototype.repeat()可能是你感兴趣的。 因为它只是重复没有逗号的字符串,所以下面也会为你做这个:

function repeatString(s, count) {
  return (s + ", ").repeat(count).replace(/,\s$/, "");
}

现在你可以像

那样使用它



function repeatString(s, count) {
  return (s + ", ").repeat(count).replace(/,\s$/, "");
}

var s = "some string";
var res = "start of string " + repeatString(s, 2) + " other string";

console.log(res);




请注意,在撰写本文时,所有浏览器都不支持repeat(),但您可以使用Polyfill

如果你从html中得到你的字符串或者已经有{{repeat ...}}的字符串,那么下面就可以了:



function repeatString(s) {
  var count = s.match(/\{\{repeat\s(\d*)\}\}/)[1];
  return (s.replace(/\{\{repeat\s\d*\}\}\s(.*)\s\{\{\/repeat\}\}/, "$1") + ", ").repeat(count).replace(/,\s$/, "");
}

var s = "{{repeat 5}} some string {{/repeat}}";
var res = "start of string " + repeatString(s) + " other string";

console.log(res);




值得一提的是,有许多html模板引擎已经可用作开源项目。在大多数情况下,使用其中一个而不是重新发明轮子是一个好主意。

答案 1 :(得分:1)

您可以替换替换回调中的文本:

JSON.print()

function fillArray(s, num) { var arr = []; for (var i=0; i<num; i++) { arr.push(s); } return arr; } var str = 'start of string {{repeat 2}} some string {{/repeat}} another string '; var res = str.replace(/{{repeat\s+(\d+)}}([\s\S]*?){{\/repeat}}/g, function($0, $1, $2) { return fillArray($2.trim(), parseInt($1, 10)).join(", "); }); console.log(res);函数创建一个数组,其中包含必要数量的提取字符串出现次数。

获得所需内容的正则表达式

fillArray

<强>详情:

  • /{{repeat\s+(\d+)}}([\s\S]*?){{\/repeat}}/g - 文字字符序列
  • {{repeat - 1+空格
  • \s+ - 第1组:一个或多个数字
  • (\d+) - 文字}}
  • }} - 第2组,任意0个字符,尽可能少到第一个
  • ([\s\S]*?) - 文字{{\/repeat}}