Visual Studio 2015 年社区 - 正则表达式查找和替换

Visual Studio 2015 community - Regex Find and Replace

我正在尝试编写一个正则表达式来查找和替换 visual studio 中的代码。

以下是现有代码的示例:

GameObject go = Instantiate(...);
GameObject go2 = (GameObject)Instantiate(...);
GameObject go3 = ReplaceThis.Instantiate(...);
GameObject go4 = DontReplaceThis.Instantiate(...);

我基本上需要一个正则表达式来将代码段更改为以下内容:

GameObject go = ReplacedClass.Instantiate(...);
GameObject go2 = (GameObject)ReplacedClass.Instantiate(...);
GameObject go3 = ReplacedClass.Instantiate(...);
GameObject go4 = DontReplaceThis.Instantiate(...);

如您所见,DontReplaceThis.Instantiate(...); 是唯一没有被替换的。

到目前为止我有:

Find: (?=.*Instantiate)(?=?!DontReplaceThis.)

这一直有效,直到我添加了 ?= 逻辑和正则表达式。

编辑:

本质上,我希望在 class 范围的运算符成员之前有一个正则表达式查找和替换匹配 (.*Instantiate) 但不包含 DontReplace 的任何内容。它还应将替换字符串附加到 .Instantiate 的所有实例,以便它们变为 ReplacedClass.Instantiate

因为您正在寻找 Instantiate 作为方法调用并且只想在 不是 前面有 DontReplaceThis. 时替换它 您可以使用否定回顾:

搜索模式:

((\w+\.)|\s)?(?<!DontReplaceThis\.)(Instantiate\()

替换模式:

ReplacedClass.

解释:

?<! 仅当前面没有以下字符串时才匹配。 (在这种情况下:DontReplaceThis

((\w+\.)|\s)? 如果前面有

则可选地匹配

\w+\. 出现 1 次或多次后跟一个点的任何单词字符

|

\s任意白色space字符

\( 匹配左括号。方法调用的指示

(Instantiate\() 括号定义了一个组,可以通过 在替换模式中访问该组(插入第三个匹配组)

有关详细信息,请查看 regex look-arounds

您可以使用

(?:\w+\.)?(?<!\bDontReplaceThis\.[\w.]*)(\bInstantiate)(?=\()

regex demo

详情

  • (?:\w+\.)? - 一个可选的(如 (...),例如不应匹配的)序列
    • \w+ - 1 个或多个单词字符
    • \. - 一个 . 字符
  • (?<!\bDontReplaceThis\.[\w.]*) - 如果 DontReplaceThis. 作为一个完整的词(\b 是一个词边界)后跟 0+ 词或 . 立即在当前位置左侧的字符(实际上,它无法匹配 var x = DontReplaceThis.Some.Class.Instantiate(...),如果需要匹配它,则需要删除 [\w.]*
  • (\bInstantiate) - 第 1 组 (</code>) 匹配 <code>Instantiate
  • (?=\() - 后跟一个 ( 字符(未添加到匹配中,因为它是一个积极的先行)。

结果: