如何通过正则表达式替换package.json中所有workspace类型的依赖版本
问题分析与解决方案
你的问题出在正则表达式的贪婪匹配特性上,我来帮你拆解清楚:
错误原因
你使用的正则/(workspace:packages/(.*))/g中,.*是贪婪模式的通配符——它会尽可能多地匹配任意字符(除换行外)。在你的输入字符串里,它会从第一个workspace:packages/开始,一直匹配到字符串的最后一个可匹配位置,也就是把workspace:packages/common","@octopol/aa": "workspace:packages/aa这整段都包含进匹配结果里。替换后自然就只剩下前面的"@octopol/common": "1.0.0,后面的内容都被覆盖掉了。
正确的解决方法
你需要把贪婪匹配改成非贪婪,或者更精准地限定匹配范围,这里给你两种可靠的方案:
方案1:使用非贪婪匹配
把.*改成.*?,让正则匹配到第一个可能的结束点(也就是下一个双引号之前):
'"@octopol/common": "workspace:packages/common","@octopol/aa": "workspace:packages/aa",'.replace(/workspace:packages\/.*?/g, "1.0.0")
方案2:精准匹配到双引号为止
因为workspace:packages/<something>是包裹在双引号里的,所以可以用[^"]+匹配所有非双引号的字符,这样能更精准地定位要替换的内容:
'"@octopol/common": "workspace:packages/common","@octopol/aa": "workspace:packages/aa",'.replace(/workspace:packages\/[^"]+/g, "1.0.0")
两种方案执行后,都会得到你预期的结果:"@octopol/common": "1.0.0","@octopol/aa": "1.0.0",
另外补充一句:你原来正则里的括号其实是多余的,因为不需要捕获组来提取内容,直接匹配整个目标片段替换即可。
内容的提问来源于stack exchange,提问作者Stav Alfi
相关产品推荐
相关产品推荐

