使用正则表达式在C#代码文件中查找方法

使用正则表达式在C#代码文件中查找方法,c#,regex,textedit,C#,Regex,Textedit,我有30个C#类文件,它们都有一个名称相同但代码不同的a方法,我想通过搜索C#类文件中与该方法匹配的正则表达式以及其中的任何内容来改变这一点。到目前为止,我的正则表达式可以找到方法的第一行(这是最简单的部分),但我不知道如何找到中间有未知字符数的开始大括号和结束大括号 这是我的尝试,但我不是专家 private void btnDelete_Click\(object sender, EventArgs e\) \{ \S \} 这就是我需要找到的方法 private void btn

我有30个C#类文件,它们都有一个名称相同但代码不同的a方法,我想通过搜索C#类文件中与该方法匹配的正则表达式以及其中的任何内容来改变这一点。到目前为止,我的正则表达式可以找到方法的第一行(这是最简单的部分),但我不知道如何找到中间有未知字符数的开始大括号和结束大括号

这是我的尝试,但我不是专家

private void btnDelete_Click\(object sender, EventArgs e\)
\{
\S
\}
这就是我需要找到的方法

    private void btnDelete_Click(object sender, EventArgs e)
    {
        if (gridView1.RowCount <= 0) return;

        this.rowHandle = gridView1.FocusedRowHandle;
        currentState = state.delete;

        MessageResult res = new Global.sysMessages.sysMessagesClass().viewMessage(
            MessageType.Warning,
            "Delete Warning",
            "You are about to delete this record from the system forever.\nare you sure you want to continue?",
            ButtonTypes.YesNo,
            MessageDisplayType.Small);

        if (res == MessageResult.Yes)
        {
            delete(rowHandle);
            loadGrid();
        }
        currentState = state.idle;
    }
private void btnDelete\u单击(对象发送者,事件参数e)
{
if(gridView1.RowCount解决方案

演示

讨论 中心问题是如何匹配最后一个大括号。我假设
btnDelete\u Click
方法没有放在类的末尾。否则,这个正则表达式是无用的

此正则表达式可用于具有一次性使用寿命的快速而繁琐的工作。

试试这个:)

不要忘记DOTALL,即
匹配所有内容,包括
\n

\{.+?\}
之间的所有内容都是方法的代码

更新: 正如所指出的,上面的正则表达式将失败,因此下面是一个递归函数,它似乎可以做到这一点:

{(?:[^{}]+|(?R))*}

此外,如果字符串变量中有
}
,它将失败,我正在研究的是,在简单作业中使用解析器有时可能会有些过分:)

如果该方法不在文件末尾,并且您知道以下方法的范围(在本例中为“private”),您可以使用

void btnDelete_Click(.|\n)*(?=private)

这是罗斯林可以帮忙的地方。但无论如何,你为什么要这么做?你这样做的目的是什么?关于反射,这会有帮助吗?你可能不应该使用正则表达式来解析代码,大约80%的时间它会匹配你不想匹配的东西。这是否也需要考虑匿名方法,在这种情况下,这将变得复杂。我会说,与一个文件一个文件地手动执行相比,自动化这项工作更难、更容易出错……如果您在不同的文件中有30个同名的方法,并且实现几乎相同,您不应该使用一些可靠的设计原则吗?并开始将其更改为一个公开这些方法并使用子方法来实现差异的类?这样,您只需更改一个方法即可对所有人都有效。不幸的是,这并不能找到整个方法,如果方法中有if语句,它将停止查看if的“}”,在这种情况下,它会找到整个方法,直到在方法结束“}”之前有一行代码。。。我有一行写着“state=states.loading”,但没有找到line@5tar-Kaster你能添加包含这一行的方法体吗?我想我会更新这个问题来添加整个删除代码,但我开始认为这可能比我最初想象的要困难一些。
{(?:[^{}]+|(?R))*}
void btnDelete_Click(.|\n)*(?=private)