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

4
我有大约30个C#类文件,它们都有一个名称相同但代码不同的方法。我想通过搜索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;
    }

欢迎提出任何问题,感谢您的帮助。


1
这就是Roslyn可以帮助的地方。但无论如何,你为什么想要这样做?你想通过这样做实现什么?反射呢?它会有帮助吗? - Ahmed ilyas
这需要考虑匿名方法吗?如果是的话,那么这将变得复杂。 - liquidsnake786
@Ahmed Ilyas,就像我说的那样,我有30多个代码文件需要更改方法,如果我能在几分钟内完成,那将是非常棒的...但现在我需要打开每个文件,向下滚动以查找该方法并粘贴新代码...这样做5次左右后,我会感到非常无聊... - 5tar-Kaster
1
我认为自动化这个过程比逐个文件手动处理更加困难且容易出错。 - mortb
1
如果您在不同的文件中有30个具有相同名称且几乎相同实现的方法,难道您不应该使用一些SOLID设计原则吗?并开始将其更改为公开这些方法并使用子方法处理差异的类?这样,您只需要更改一个方法即可适用于所有情况。 - woutervs
显示剩余5条评论
3个回答

1
解决方案
private\s+void\s+btnDelete_Click\s*\(object\s+sender,\s*EventArgs\s+e\)\s*\{.+;\s+\}\s*

Regular expression visualization

演示

这里

讨论

中心问题是如何匹配最后一个花括号。我假设btnDelete_Click方法不是放在类的末尾。否则,这个正则表达式是无用的

这个正则表达式可用于快速而简单的工作,只有一次使用寿命。


在这种情况下,它会找到整个方法,直到方法结束的代码行的前一行 "}"... 我有一行代码,上面写着 "state = states.loading;",但它没有找到那一行。 - 5tar-Kaster
@5tar-Kaster,你能添加包含这行代码的方法体吗? - Stephan
我想我会更新问题,添加整个删除代码,但我开始觉得这可能比我最初想的要困难一些。 - 5tar-Kaster

1
尝试一下这个:)

\s*private\svoid\sbtnDelete_Click\(.*?\)\s*\{.+?\}(?!['"].*\}.*['"].*)

不要忘记DOTALL,即 . 匹配包括 \n 在内的所有内容。 \{.+?\}之间的所有内容都是该方法的代码。

更新:

如指出的那样,上面的正则表达式将失败,因此这里是一个递归似乎可以解决问题:
{(?:[^{}]+|(?R))*}

此外,如果字符串变量中包含 },它将失败,我正在研究这个问题,因为有时候使用解析器处理简单任务会过于复杂 :)

不幸的是,这并不能找到整个方法,如果该方法中有一个if语句,它会在“}”之后停止查找... - 5tar-Kaster

-1
如果方法不在文件末尾,并且您知道以下方法的范围(在此示例中为“private”),则可以直接使用。
void btnDelete_Click(.|\n)*(?=private)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接