正则表达式查找函数的所有引用并将参数替换/添加到所有实例

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,这很好。我会将它添加到异常中。

以上是关于正则表达式查找函数的所有引用并将参数替换/添加到所有实例的主要内容,如果未能解决你的问题,请参考以下文章

查找并替换所有以 # 开头的单词,并将标签文本包装在 HTML 中

正则表达式 之 回溯引用:前后一致匹配

VSCode 正则表达式查找和替换子匹配数学?

查找替换的正则表达式

正则表达式中的 Eclipse 更改案例查找和替换

正则 表达式(替换)// 引用