【发布时间】:2015-07-26 01:08:49
【问题描述】:
我正在为一个库编写一个模板实用程序,并尝试以一种功能性的方式来完成它(没有可变变量,理想情况下没有中间状态)。 这主要是一个学习练习,我知道那里已经有图书馆这样做了。
给定字符串:
"Hello, {{name}}! What are you doing on {{day}}?"`
我已将模板标签与正则表达式进行匹配,它与范围查找功能相结合会将标记的匹配项作为“范围”对象返回。
[
{ start: 7, end: 14 },
{ start: 39, end: 45 }
]
我想将整个字符串定义为范围,以便我可以将范围编译成函数列表。
[
{ start: 0, end: 6 }
{ start: 7, end: 14, tag: true },
{ start: 15: end: 38 }
{ start: 39, end: 45, tag: true },
{ start: 46, end: 46 }
]
标记它们不是问题,但找到其他范围是问题。这个任务显然可以用一个 for 循环和一些计数器变量来完成,但是你会改变状态。 for、forEach 和 while 是不可能的。
在不改变状态的情况下如何完成这项工作?是否有可能一次获得所有范围(而不是使用正则表达式然后第二遍来找到反向范围)?
最终,我会得到一个看起来像这样的绑定函数列表:
[
text('Hello, '),
lookup('name'),
text('! What are you doing on '),
lookup('day'),
text('?')
]
调用这些将导致一系列查找,这些查找将返回字符串值,而文本函数只是绑定的标识函数,将返回其参数。
【问题讨论】:
-
我知道这是一个学习练习,但是获取子字符串的位置有什么特别的原因吗?
-
如果可以,则不然。我的目的是跟踪子字符串索引,以便稍后将它们切出,以便以后构建就地模板函数。
-
replace方法非常灵活,因为它可以将回调函数作为替换参数,并且使用它你不需要知道索引是什么。 -
警告!不推荐
"Hello, {{name}}! What are you doing on {{day}}?".match(/\{\{\w+}}|.+?(?=\{\{\w+}}|$)/g) -
我在想这样的事情:eval.in/357793(没有建立函数列表的步骤)
标签: javascript regex functional-programming templating