如何编写可匹配含复杂参数的$t函数调用的正则表达式?
匹配$t函数调用的正则解决方案
你的问题出在最初的正则用了[^)]+,它会在遇到第一个)时就停止匹配,完全忽略引号内的括号。要覆盖所有提到的参数场景,不需要后行断言,而是用递归匹配处理嵌套括号+分支覆盖不同参数类型来解决。
最终正则表达式
/\$t\((?:('(?:\\'|[^'])*')|("(?:\\"|[^"])*")|(`(?:\\`|[^`])*`)|((?:[^()]+|\((?4)\))+))\)/g
正则各部分解释
\$t\(:精准匹配$t(开头- 括号内的参数部分用分支覆盖所有情况:
'(?:\\'|[^'])*':匹配单引号包裹的字符串,支持转义单引号(比如'It\'s okay')"(?:\\"|[^"])*":匹配双引号包裹的字符串,支持转义双引号`(?:\\`|[^`])*`:匹配ES6模板字符串,支持转义反引号(?:[^()]+|\((?4)\))+:匹配变量或复杂表达式,(?4)递归引用当前分支,实现嵌套括号的正确匹配
测试覆盖场景
这个正则能正确匹配以下所有情况:
- 带括号的字符串:
$t('Name (optional)') - 字符串拼接:
$t('hello' + x)、$t("hello" + x) - 模板字符串:
$t(hello ${x}) - 变量/函数调用:
$t(x)、$t(getKey()) - 嵌套括号的表达式:
$t((a + (b * 2)) / c)
JS使用示例
const code = ` $t('Name (optional)') $t('hello' + user.name) $t("Hello " + "World") $t(\`hello \${x}\`) $t(getKey()) $t((a + (b * 2)) / c) `; const regex = /\$t\((?:('(?:\\'|[^'])*')|("(?:\\"|[^"])*")|(`(?:\\`|[^`])*`)|((?:[^()]+|\((?4)\))+))\)/g; const matches = code.match(regex); console.log(matches);
内容的提问来源于stack exchange,提问作者phper
相关产品推荐
相关产品推荐

