【问题标题】:Visual Studio 2015 community - Regex Find and ReplaceVisual Studio 2015 社区 - 正则表达式查找和替换
【发布时间】:2018-02-07 07:05:02
【问题描述】:

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

以下是现有代码示例:

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

我基本上需要一个正则表达式来将 sn-p 更改为以下内容:

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

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

到目前为止我所拥有的:

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

直到我添加了?= 逻辑和正则表达式。

编辑:

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

【问题讨论】:

  • 这很难理解,你能不能也把一些输入文本的例子放在引号和你想要的输出中
  • @MichaelRandall 我在我的问题中添加了对匹配条件的解释。至于输入,您可以使用第一个代码 sn-p,其输出将是第二个代码 sn-p。我不确定如何简化示例输入和输出。
  • 啊,我明白了,你在某种源文件上运行它
  • @ChristopherLeong 请考虑accepting/upvoting the answer then

标签: c# regex visual-studio-2015 replace find


【解决方案1】:

你可以使用

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

regex demo

详情

  • (?:\w+\.)? - 一个可选的(如(...),例如,不应匹配)序列
    • \w+ - 1 个或多个单词字符
    • \. - 一个 . 字符
  • (?&lt;!\bDontReplaceThis\.[\w.]*) - 如果将 DontReplaceThis. 作为一个完整的单词(\b 是单词边界)后跟 0+ 单词或 . 字符紧跟在当前位置的左侧(实际上是, 像var x = DontReplaceThis.Some.Class.Instantiate(...)这样的匹配失败,如果你需要匹配它,你需要删除[\w.]*)
  • (\bInstantiate) - 匹配 Instantiate 的第 1 组 ($1)
  • (?=\() - 后跟 ( 字符(未添加到匹配中,因为它是正向前瞻)。

结果:

【讨论】:

  • is this: [\w.]* 意味着在调用之前匹配可能的嵌套对象,例如 DontReplaceThis.SubProperty.SubSubProperty.Instantiate
  • @MongZhu 是的,我在答案中解释了。只需将var x = DontReplaceThis.Some.Class.Instantiate(...) 粘贴到 regexstorm.net 的演示小提琴中,您就会看到它不匹配。删除 [\w.]* 将匹配它。
  • 完美,这是最佳答案
【解决方案2】:

由于您正在寻找 Instantiate 作为方法调用,并且只想在它DontReplaceThis. 开头时替换它,因此您可以使用否定的lookbehind:

搜索模式:

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

替换模式:

ReplacedClass.$3

解释:

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

((\w+\.)|\s)? 匹配可选,如果前面有任何一个

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

|

\s 任何空白字符

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

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

更多信息请查看regex look-arounds

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2011-11-29
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多