我需要帮助以REGEX提取翻译字符串

时间:2019-07-16 09:53:15

标签: javascript regex

我有很多用字符串翻译的JavaScript文件。我想提取所有这些文件,然后生成一个翻译文件。我需要帮助来制作REGEX模式。

这里有一些我想摘录的例子。

$t('Hello everybody') // extract => Hello everybody
$t("I'm Paul") // extract => I'm Paul
$t("I'm {name}", {name:username}) // extract => I'm {name}
$t('Select {count}', {count: count}) + $t(' element | elements', count) + $t(' on this page') 

对于4h示例,要提取的字符串:
选择{count}
 元素|元素
 在此页面上

这些字符串在javascript文件中。 您能帮我建立REGEX模式吗?

感谢帮助。

1 个答案:

答案 0 :(得分:1)

根据您的示例,使用以下正则表达式:

\$t\((['"])(.*?)\1

提取的数据将驻留在捕获组2中。如果字符串文字包含转义的定界符,则模式将失败。请注意非贪婪子模式.*?,这对于示例4是必不可少的。

如果您需要考虑转义的定界符,它将使模式变得复杂:

\$t\((['"])(.*?)(?<!\\)\1

转义符号\后面的负数阻止匹配在转义的分隔符处终止。请注意,转义符号需要转义。如果您的正则表达式引擎不支持负向后查找,则可以选择将无定界符的子字符串和转义的分隔符的交替序列与负向提前匹配以防止过早终止:

\$t\((['"])((.*?)(\\\1(.*?))*(?!\\))\1

但是,通过适当的字符类来表示无定界符的子字符串,您也可以取消否定的前瞻:

\$t\((['"])((.*?)(\\\1([^\\]*?))*)\1