我在使表达式替换函数的全部内容时遇到了一些麻烦。例如
void function1 (void)
{
Some junk here();
Other Junk here
{
Blah blah blah
}
}
我想用一些预定义的值替换此函数的内容,即
void function1 (void)
{
Something else here
}
这是我目前所拥有的,但它似乎不起作用。我试图捕获函数的第一部分,然后是结束的大括号,它本身就在一个新的行上。我对正则表达式很新,所以请原谅我,如果没有意义
text = Regex.Replace(text, @"(function1)*?(^}$))", Replace, RegexOptions.Multiline);
任何想法我做错了什么或者我应该怎么做?
答案 0 :(得分:0)
这就是我想出的。让我知道它是否适合你。
public static string Replace_Function_Contents(string old_function, string new_contents)
{
Regex function_match = new Regex(@"(\s){1,}?([\s\w]{1,})?(\s{1,})?\(.{1,}?\)(\s{1,}){");
var match = function_match.Match(old_function);
return old_function.Remove(match.Index + match.Length) + new_contents + "}";
}
答案 1 :(得分:-2)
这似乎有效:
/function1(?:.|\n)*?^}/m
我认为正则表达式的主要问题是(function1)*
,它与字符串"function1"
匹配零次或多次。匹配字符串的示例包括""
和"function1function1function1"
。您可能意味着(function1).*
,但除非在.NET的正则表达式引擎中工作方式不同,否则.
不会匹配换行符。我使用(?:.|\n)
代替换行符。我也删除了捕获,因为你对我的关于反向引用的问题的回答似乎并没有表明你实际上在使用它们。
你的正则表达式中还有一个额外的右括号,我预计会导致错误。
完整的C#代码:
using System;
using System.Text.RegularExpressions;
namespace regex
{
class Program
{
static void Main(string[] args)
{
var text = @"something up here
void anotherfunc(int x)
{
}
void function1 (void)
{
Some junk here();
Other Junk here
{
Blah blah blah
}
}
int main()
{
}";
var replacement = @"function1 (void)
Something else here
}";
Console.Out.WriteLine(Regex.Replace(text, @"function1(?:.|\n)*?^}", replacement, RegexOptions.Multiline));
}
}
}
输出:
something up here
void anotherfunc(int x)
{
}
void function1 (void)
Something else here
}
int main()
{
}