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我用正则表达式找到了一个解决方案,但使用记事本++啊,非常聪明。你的两个选择似乎都很适合我想做的事情。非常感谢,这将帮助我堆!