从Shopify翻译中提取键和参数

时间:2018-07-17 10:31:00

标签: javascript regex

我有此文本模式(Shopify Doc):

{{- 'blog.comment.email' | t -}}
{{ 'layout.header.hello_user' | t: name: customer.first_name }}
{{ 'layout.comment.metadata' | t: author: comment.author, email: comment.email  }} 
{{'layout.comment.metadata'|t:author:comment.author,email:comment.email}}

我需要获取参数的“名称”和“键”。

{{- 'blog.comment.email' | t -}} 
#expected_result = [blog.comment.email]

{{ 'layout.header.hello_user' | t: name: customer.first_name }}
#expected_result = [layout.header.hello_user, name]

{{ 'layout.comment.metadata' | t: author: comment.author, email: comment.email  }}
#expected_result = [layout.comment.metadata, author, email]

//without spaces    
{{'layout.comment.metadata'|t:author:comment.author,email:comment.email}}
#expected_result = [layout.comment.metadata, author, email]

正则表达式

{{- 'blog.comment.email' | t -}}
{{-? *'(.*)' *\| *t *-?}} works for the first case.
result = [blog.comment.email]

{{ 'layout.header.hello_user' | t: name: customer.first_name }}
{{-? *'(.*?)' *\| *t:? *((.+): *.*?)* *-?}} "works" for the second case,
result = [layout.header.hello_user, name: customer.first_name, name] 
#expected_result = [layout.header.hello_user, name]

但是它也提取'name:customer.first_name',我只需要'layout.header.hello_user'和'name'

我无法使用第三个选项,我已经尝试过:

{{ 'layout.comment.metadata' | t: author: comment.author, email: comment.email  }}
{{-? *'(.*?)' *\| *t:? *(([A-Za-z0-9]+): *.*?)* *-?}}
result = [layout.header.hello_user, name: email: comment.email, email]
#expected_result = [layout.header.hello_user, author, email]

但是它仅提取最后一个参数。

参数数量没有限制

要求存在“ | t”或“ | t”或“ | t”

1 个答案:

答案 0 :(得分:0)

检查下一个正则表达式(?<={{-?\s*'(?<key>[^']+)'\s*\|\s*t\s*(?::(?:\s*\w+\s*:\s*[.\w]+\s*,)*)?)(?:\s*(?<param>\w+)\s*:\s*[.\w]+\s*)?(?=(?:,\s*\w+\s*:\s*[.\w]+\s*)*-?}})

要在线尝试正则表达式并获取说明,请单击here

但是建议的解决方案需要进一步处理,因为每个单独的匹配都是键参数对,而不是键参数。

警告:regex101.com无法在运行iOS 11.4的iPad上运行的Safari中处理此正则表达式。