正则批量查找未套t()的jsx文本需分场景编写匹配规则,如title="([^"]*)"捕获属性值、>([^

怎么用正则批量找没套 t() 的 JSX 文本
VSCode 自带的「查找替换」就能干这事,关键是正则要写对,否则容易漏匹配或误伤结构。你得先打开 Ctrl+H(Cmd+H),点右上角 .* 按钮启用正则模式。
-
(<button>[\s\n]*)(\w+)([\s\n]*</button>)这个表达式能捕获<button>Save</button>这类单标签+纯单词的场景,$2就是你要国际化的文本 - 如果文本含空格或换行(比如
<button>\n Cancel\n</button>),上面的\w+就会失效——得换成([^\n]+),但要注意可能抓到空白符,建议先手动检查几处再批量替换 - 别指望一条正则通吃所有组件:
<div>Text</div>、title="Text"、placeholder="Text"都得单独写规则,强行合并容易出错
替换时为什么不能直接写 {t('xxx')}
因为 JSX 里不是所有地方都支持 {t(...)} 直接插入——比如属性值里写 title={t('Save')} 是合法的,但 title="Save" 改成 title={t('Save')} 后,引号和等号位置必须严格对应,否则语法报错。
- 用
$1{t('$2')}$3这种带捕获组的替换,能保留原始标签结构(属性、空白、闭合标签),避免破坏 JSX 语法 - 如果原文本带双引号(如
title="OK"),别用title={t('$2')}硬套——得先改成title={t('OK')},否则会变成title={t("OK")}引号不匹配 - 大小写必须原样保留:
Start→{t('Start')},不能自动转小写,i18n 文件里怎么定义,就怎么写进去
哪些地方最容易被正则漏掉
硬编码藏得最深的地方,往往不是 <button>Text</button> 这种显眼结构,而是嵌套、多行、带插值或注释干扰的场景。
-
<contentwrapper title="Connection"></contentwrapper>这种自闭合组件,正则得专门匹配title="([^"]*)",且要关掉「匹配大小写」避免漏掉Title或data-title -
{isEditing ? 'Update' : 'Create'}这类三元表达式里的字符串,正则很难安全提取,建议留到最后人工处理 - 注释里混着的字符串(如
// default label: "Submit")会被正则误抓,搜索时加^或$锚点也没用,得靠!//排除,但 VSCode 不支持负向先行断言,只能手动跳过
改完之后怎么验证没搞砸
批量替换完别急着提交,JSX 结构一旦破坏,轻则编译报错,重则运行时白屏——尤其当 t() 调用位置不对时。
- 先跑一遍
npm run build或yarn build,看有没有Adjacent JSX elements must be wrapped或Unexpected token这类错误 - 打开浏览器开发者工具,过滤
console.error,重点看是否出现t is not defined——说明某些地方漏装 i18next,或者t没传进组件作用域 - 别忽略空格和换行:替换后
<button>{t('Save')}</button>如果前后多了空格,可能影响 UI 布局,尤其是 inline 元素
真实项目里,硬编码从来不在表面,而是在你没注意的属性、条件分支、甚至 mock 数据里。正则只是第一刀,后面总得人工扫一遍控制台报错和视觉回归。











