【发布时间】:2017-04-03 08:54:17
【问题描述】:
我正在尝试翻译这个:
{% img <right> /images/testing %}
进入这个:
{{< figure <class="right"> src="/images/testing" >}}
在 Golang 中使用正则表达式。源字符串中<> 中的部分是可选的。
当第一个捕获组存在时(“right”),我有这段代码,它似乎在主测试用例中工作:
regexp.MustCompile(`{%\s*img\s*(\p{L}*)\s+([/\S]+)\s+%}`)
.ReplaceAllString("{% img right /images/testing %}", "{{< figure class=\"$1\" src=\"$2\" >}}")
但是,如果缺少可选组,我会得到:
{{< figure class="" src="/images/testing" >}}
这不是我需要的 - 我希望整个 class="" 部分消失,如下所示:
{{< figure src="/images/testing" >}}
这可能吗?我可以在替换字符串中以某种方式指出:
{{< figure class=\"$1\" src=\"$2\" >}}
如果可选组为空,我希望其他文本 ("class=") 消失吗?
【问题讨论】:
-
我不确定
go是否支持条件,但它们将是可行的方法。另见stackoverflow.com/questions/6804586/how-to-conditional-regex -
不幸的是,Go 正则表达式似乎不支持此功能。不过,感谢您的提示!
-
你必须添加一个自定义函数,到 template.funcmap() golang.org/pkg/text/template/#FuncMap 然后你的模板调用你的自定义函数,该函数执行正则表达式并将数据返回给模板,也调用 funcmap在解析模板之前,否则会抛出错误。有关更多示例,请参见此处technosophos.com/2013/11/23/…