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)(?=\()
详情
(?:\w+\.)?
- 一个可选的(如 (...)
,例如不应匹配的)序列
\w+
- 1 个或多个单词字符
\.
- 一个 .
字符
(?<!\bDontReplaceThis\.[\w.]*)
- 如果 DontReplaceThis.
作为一个完整的词(\b
是一个词边界)后跟 0+ 词或 .
立即在当前位置左侧的字符(实际上,它无法匹配 var x = DontReplaceThis.Some.Class.Instantiate(...)
,如果需要匹配它,则需要删除 [\w.]*
)
(\bInstantiate)
- 第 1 组 (</code>) 匹配 <code>Instantiate
(?=\()
- 后跟一个 (
字符(未添加到匹配中,因为它是一个积极的先行)。
结果:
我正在尝试编写一个正则表达式来查找和替换 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)(?=\()
详情
(?:\w+\.)?
- 一个可选的(如(...)
,例如不应匹配的)序列\w+
- 1 个或多个单词字符\.
- 一个.
字符
(?<!\bDontReplaceThis\.[\w.]*)
- 如果DontReplaceThis.
作为一个完整的词(\b
是一个词边界)后跟 0+ 词或.
立即在当前位置左侧的字符(实际上,它无法匹配var x = DontReplaceThis.Some.Class.Instantiate(...)
,如果需要匹配它,则需要删除[\w.]*
)(\bInstantiate)
- 第 1 组 (</code>) 匹配 <code>Instantiate
(?=\()
- 后跟一个(
字符(未添加到匹配中,因为它是一个积极的先行)。
结果: