C# 跨两个字符串之间的多行替换文本段-regex

C# 跨两个字符串之间的多行替换文本段-regex,c#,regex,visual-studio-code,C#,Regex,Visual Studio Code,我目前正在努力让我的正则表达式匹配两个字符串之间的所有内容,然后在第一个匹配中匹配多行 所以我想从这开始 if { // A comment foo(c.AAA); bar(c.AAA); foobar(c.AAA); } else { foo(c.AAA); bar(c.AAA); foobar(c.AAA); } 对此 if { // A comment foo(c.BBB); bar(c.BBB); foobar(c.BBB); } el

我目前正在努力让我的正则表达式匹配两个字符串之间的所有内容,然后在第一个匹配中匹配多行

所以我想从这开始

if
{
  // A comment 
  foo(c.AAA);
  bar(c.AAA);
  foobar(c.AAA);
}
else 
{
  foo(c.AAA);
  bar(c.AAA);
  foobar(c.AAA);
}
对此

if
{
  // A comment 
  foo(c.BBB);
  bar(c.BBB);
  foobar(c.BBB);
}
else 
{
  foo(c.AAA);
  bar(c.AAA);
  foobar(c.AAA);
}
我能够匹配评论和其他单词之间的所有内容

但我希望能够匹配“c.AAA”,并以批量方式将其替换为“c.BBB”

任何帮助都将不胜感激


编辑:为了清晰起见,我只想补充一点,我专门使用的代码是c#,查找和替换是在大量文件中进行的。我之前没有提到它,因为我仍然有兴趣发现使用regex是否可以做到这一点,我不知道使用单个regex实现这一点的方法,但是您可以使用一个小的Python脚本来完成。 首先,您可以使用两个字符串作为分隔符将文本拆分为块:

import re

text = """if
{
  // A comment 
  foo(c.AAA);
  bar(c.AAA);
  foobar(c.AAA);
}
else 
{
  foo(c.AAA);
  bar(c.AAA);
  foobar(c.AAA);
}
"""

chunks = re.split(r'(// A comment|else)', text)
这将给出:
['\nif\n{\n','//A comment','\n foo(c.AAA);\n bar(c.AAA);\n foobar(c.AAA);\n foobar(c.AAA);\n}\n','else','\n{\n foo(c.AAA);\n bar(c.AAA);\n foobar(c.AAA);\n}\n']

然后可以使用循环修改分隔符之间的部分并生成最终字符串:

output = chunks[0]
prev = chunks[0]
for c in chunks[1:]:
    if prev == "// A comment":
        c = c.replace("c.AAA", "c.BBB")
    output += c
    prev = c

print(output)
重构你的代码

auto arg=c.AAA;
if(xyz){
arg=c.BBB;
}
foo(arg);
bar(arg);
foobar(arg);
编辑

对于C#你可以写

var arg=c.AAA;
if(xyz){
arg=c.BBB;
}
foo(arg);
bar(arg);
foobar(arg);
编辑2

它可以用正则表达式完成,但我不能用VSC实现

使用Notepad++时,带有否定字符集的正则表达式搜索包括换行符

在记事本++中,在
Find/Replace
对话框中有
Find-In-Files
,它显示了文件中的替换次数。在所有子文件夹中选中复选框
跟随当前文档
,也可以选择

查找:
(//注释[^}]+?)c\.AAA

替换:
\1c.BBB

搜索模式:正则表达式


应用此查找/替换直到替换数量为0

您可以使用“在选择中查找”切换来替换启用的查找选择非常方便,但我需要在大量文件中执行此操作,因此遗憾的是,这并不能真正帮助我。这似乎是一个好的解决方案,但我已经编辑说我正在使用c#,很遗憾,这种decltype方法对我不起作用。@C#中的Mi krater称为
var arg=C.AAA啊对。我觉得很傻。虽然我没有用和你完全一样的方式做,但逻辑是一样的。我仍然想知道我想要的是不是可以使用正则表达式,但我会接受你的答案!非常感谢@Mi krater我用正则表达式找到了一个解决方案,但使用记事本++啊,非常聪明。你的两个选择似乎都很适合我想做的事情。非常感谢,这将帮助我堆!