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;
    }

欢迎任何帮助,谢谢

4

3 回答 3

1

解决方案

private\s+void\s+btnDelete_Click\s*\(object\s+sender,\s*EventArgs\s+e\)\s*\{.+;\s+\}\s*

正则表达式可视化

演示

这里

讨论

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

此正则表达式可用于具有一次性使用期限的快速而肮脏的工作。

于 2013-11-27T10:11:50.260 回答
1

尝试这个 :)

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

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

之间的一切都是\{.+?\}方法的代码。

更新:

正如所指出的,上面的正则表达式会失败,所以这里有一个似乎可以解决问题的递归:

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

此外,如果}内部有字符串变量,它会失败,我正在研究使用解析器进行简单工作有时可能会过度杀伤力:)

于 2013-11-27T10:25:23.517 回答
-1

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

void btnDelete_Click(.|\n)*(?=private)
于 2018-07-11T09:56:20.170 回答