ES6 / JS:用条件链替换 delve 的正则表达式

ES6 / JS: Regex for replacing delve with conditional chaining

如何在 vs code 项目中用条件链替换 delve?

例如

delve(seo,'meta')
delve(item, "image.data.attributes.alternativeText")

想要的结果

seo?.meta
item?.image.data.attributes.alternativeText

是否可以在 Visual Studio 代码中使用 find/replace?

我提出以下正则表达式:

delve\(\s*([^,]+?)\s*,\s*['"]([^.]+?)['"]\s*\)

和以下替换格式字符串:

?.

解释:匹配 delve(,第一个参数直到第一个逗号(惰性匹配),然后是第二个字符串参数(没有注意确保括号匹配,因为这相当快' n'dirty anyways),然后是调用的右括号 )。考虑了合理位置的间距。

这将适用于像 delve(someVar, "key") 这样的简单案例,但可能无法用于病理案例;总是手动检查替换。

请注意,这显然无法处理 delve(var, "a.b.c"),因为据我所知,VSC 格式字符串不支持给定字符串“加入”可变数量的捕获。作为一种解决方法,您可以显式创建具有两个、三个、四个、五个...点的版本并编写相应的替换。例如,两个点的版本如下所示:

delve\(([^,]+?)\s*,\s*['"]([^.]+?)\.([^.]+?)['"]\s*\)

格式字符串为?.?..

你写:

e.g.
delve(seo,'meta')
delve(item, "image.data.attributes.alternativeText")
desired result
seo?.meta
item?.image.data.attributes.alternativeText

但我非常怀疑这是故意的,因为 delve(item, "image.data.attributes.alternativeText") 实际上等同于 item?.image?.data?.attributes?.alternativeText 而不是您描述的期望结果。要使其以这种方式处理,只需将 [^.] 替换为 . 即可使其接受包含任何字符(包括点)的字符串。