正则表达式查找函数的所有引用并将参数替换/添加到所有实例
Posted
技术标签:
【中文标题】正则表达式查找函数的所有引用并将参数替换/添加到所有实例【英文标题】:Regex find all reference of a function and replace/add a param to all instances 【发布时间】:2021-05-10 08:38:22 【问题描述】:在函数定义中更改或添加参数后,我想在所有文件中更新该函数的所有引用以具有更新的参数。
我在 VSCode 中使用多文件搜索/替换,并使用正则表达式。
一些要求
此参数可能在其他函数中 函数引用可以在多行中 不要更新不使用该参数的函数引用比如我想把function_A的param_2重命名为new_param_2
function_A(
param_1 = .... # this function_A shall not be matched because it doesn't use param_2
)
function_A(
param_1 = ....
param_2 = aaa # only this param_2 shall be renamed to new_param_2
)
function_B(
param_1 = ....
param_2 = aaa # this param_2 shall not be matched because it's not in function_A
)
【问题讨论】:
【参考方案1】:我使用下面的这个正则表达式来匹配和捕获组
(function_A(?:[^)]|\n)+?\W)(param_2)(\W?=)
其中,
(?:[^)]|\n)+?
表现一个惰性匹配在function_A之后和')'之前的多行,它是一个非捕获组。
\W)(param_2)(\W?=)
这些 \W 是为了适应掉毛差异
然后,我使用下面的正则表达式来替换和替换
$1new_param_2$3
通过这样做,我可以一次在所有文件中替换函数的所有实例。
[更新] CAVEAT:如果在 param_2 之前有一个 ')',这可能会失败,例如 function_A(param_1=sin(1.0), param_2=2,...)。如果代码库中没有出现这种情况,那么这可能会起作用。 [归功于@RootTwo]
【讨论】:
这可能已经足够好了,但是如果param_2
之前有一个')' 就会失败,例如function_A(param_1=sin(1.0), param_2=2,...)
。如果用户知道代码库中没有发生这种情况,那么这可能会起作用。
谢谢@RootTwo,这很好。我会将它添加到异常中。以上是关于正则表达式查找函数的所有引用并将参数替换/添加到所有实例的主要内容,如果未能解决你的问题,请参考以下文章