从源码中提取调用函数时使用的所有字符串的Regex。

问题描述 投票:0回答:1

我们有一个老旧的、成长中的项目,有几千个php文件,需要清理它。

在整个项目中,我们有很多类似的函数调用。

trans('somestring1');
trans("SomeString2");
trans('more_string',$somevar);
trans("anotherstring4",$somevar);
trans($tx_key);
trans($anotherKey,$somevar);

所有这些函数都被嵌入到代码中,代表翻译键。我想找到一种方法来提取所有出现的 "翻译键"。

PHP项目是在VS Code中,所以RegEx搜索将有助于列出结果。或者我可以用你推荐的任何其他工具来搜索整个项目

然而,我还需要将字符串 "导出 "到一个文本文件或类似的文件中。

理想的结果是。

somestring1
SomeString2
more_string
anotherstring4
$tx_key
$anotherKey

作为奖励--如果有人知道,我怎样才能得到上面的列表,包括找到结果的文件名--那就太好了!

任何帮助都将是非常感激的

更新:我想到的RegEx。

/(trans)+\([^\)]*\)(\.[^\)]*\))?/gim

列出完整的出现 - 我如何才能只得到结果的第一部分(单引号之间或双引号之间或以$开头),请看这里。regexr.com548d4

regex visual-studio-code
1个回答
1
投票

这里有一些步骤可以得到你想要的东西。 使用这个,你可以对你的搜索结果进行查找和替换!

所以你可以在适当的情况下进行顺序的regex findreplaces。 替换可以只在搜索结果编辑器中进行,完全不影响底层文件--这就是你想要的。

如果你愿意的话,你也可以让替换动作实际编辑底层文件。

提示:这种技术也可以使做查找项目的时候 a 换成 b 含有术语的文件中 c 做起来就简单多了】。]

(1)打开一个新的搜索编辑器。按Ctrl+换挡+P (该命令目前还没有绑定到键位上。)

(2) 将此regex粘贴到搜索输入框中(regex选项为 .* 选择)。)

     `(.*?)(\btrans\(['"]?)([^,'")]+)(.*)`  - a relatively simple regex

regex101演示


参见我的另一个答案,每行最多可以使用6个条目的regex。

(\s*\d+:\s)?((.*?)(\btrans\(['"]?)([^,'")]*)((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?)(.*)

(3) 你会得到一个包含搜索结果的文件列表。 现在打开一个查找小组件 换挡+F 在该查找编辑器中。

(4)将相同的regex放入该查找输入中。 选择了Regex选项。 把 $3 到替换字段。 这只在这个搜索编辑器中替换 - 非原文件 (虽然在某些情况下如果你想这样做也可以)。 Replace All.


如果使用1-6版本的regex,用:

$1$5  $9  $13  $17  $21  $25

(5) 瞧。 现在你可以把这个搜索编辑器保存为一个文件了。

Search Editor Find



0
投票

第一个答案对于每行一个想要的捕捉,就像原来的问题一样,是有效的。 但是,如果每行有两个或更多的话,这个相对简单的regex就不能用了。

下面的regex可以适用于每行最多6个条目,例如

trans('somestring1');
stuff trans("SomeString2"); some content trans("SomeString2a");more stuff [repeat, repeat]

但对于7岁以上的人来说就不一样了--你将会 请教 为的。

下面是这个过程,再加上一个转折的 使用搜索编辑器中的一个片段 而不是FindReplace。 使用代码段可以对最终结果的格式进行更多的控制。

(1) 打开一个新的搜索编辑器。按Ctrl键+换挡+P (该命令目前还没有绑定到键位上。)

(2) 将此regex粘贴到搜索输入框中(选择regex选项.*)。

 `((.*?)(\btrans\(['"]?)([^,'")]*)((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?)(.*)`  

regex101 demo

(3)你会得到一个包含搜索结果的文件列表。现在,请分别选择所有的搜索结果,用 Ctrl+换挡+L.

(4) 触发该键绑定。

{
  "key": "alt+i",                              // whatever keybinding you like
  "command": "editor.action.insertSnippet",
  "when": "editorTextFocus",
  "args": {
  "snippet": "${TM_SELECTED_TEXT/((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*)((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?)(.*)/$4${8:+\n      }$8${12:+\n      }$12${16:+\n      }$16${20:+\n      }$20${24:+\n      }$24/g}"

  }
},

该片段将被应用于您搜索结果中的每个选择。 这一部分 ${8:+\n } 是一个条件,如果有一个捕获组8--这将是第二个条件,则增加一个新行和一些空格。trans(...) 在一条线上。

演示。(不幸的是,它没有正确地显示出) Ctrl+换挡+L 单独选择所有的行或 祭祀+i 片段触发器)

Search Editor with a snippet transform

© www.soinside.com 2019 - 2024. All rights reserved.