C# 如何使用正则表达式提取字符串等方法的参数?

C# 如何使用正则表达式提取字符串等方法的参数?,c#,regex,C#,Regex,我有一个类似签名的方法,如下所示: void methodName(str arg1, int arg2, int arg3 = 4) { } 或 我只想提取这个函数的参数 (str arg1, int arg2, int arg3 = 4) (int arg1) 这是我试过的。这对我来说从来都不合适 string namePortion = String.Format(@"^.*{0}", "methodName"); Regex rex = new Regex(namePortion

我有一个类似签名的方法,如下所示:

void methodName(str arg1, int arg2, int arg3 = 4)
{
}

我只想提取这个函数的参数

(str arg1, int arg2, int arg3 = 4)
(int arg1)
这是我试过的。这对我来说从来都不合适

string namePortion = String.Format(@"^.*{0}", "methodName");

Regex rex = new Regex(namePortion + @"\s*(?<params>\(.*\)).*\{", RegexOptions.Compiled | RegexOptions.Multiline);
string parms = "";

Match m = rex.Match(sourceCode);

if (m.Success)
{
    parms = m.Groups["params"].Value;
}
stringnamepoint=string.Format(@“^.*{0}”,“methodName”);
Regex rex=new Regex(namepoint+@“\s*(?\(.*)).\{”,RegexOptions.Compiled | RegexOptions.Multiline);
字符串parms=“”;
Match m=rex.Match(源代码);
如果(m.成功)
{
parms=m.Groups[“params”].值;
}

我也在RegexBuddy中对此进行了测试,它似乎起了作用,所以我不确定是什么问题。

尝试将多行更改为单线

如果您的应用范围非常广泛,以下内容应该适用于您:

(?:^|[\r\n])[\w\s]*(?<params>\(.*?\))
(?:^ |[\r\n])[\w\s]*(?\(.*))
要仅获取原型(并使用大括号作为分隔符),请执行以下操作:

(?:^ |[\r\n])[\w\s]*(?\(.*))*\{
如果你想找更具体的,请告诉我


编辑添加了
(?:^ |[\r\n])
确保它位于文件或行的开头。

我认为这个正则表达式可以单独解析每个参数,但我现在无法测试它,因此使用它的风险由您自己承担。您需要在
正则表达式对象中添加一个全局标志,以便它匹配多个参数,同时也是一个单行正则表达式,因此您需要针对源代码中的每一行进行atch

String regex=“^[\s]*methodName[\s]*\\((?[^,\\)]*)*\\).*?$”;


阅读此正则表达式:在行首(
^
)匹配任意数量的空格(
[\s]*
),然后是字符串文字“methodName”(
methodName
),然后再次匹配任意数量的空格(
[\s]*
),然后是一个开括号(
\(
),然后启动一个名为“param”(
(?
)的捕获组,然后匹配任意数量的非逗号或右括号(
[^,\\)]*
),然后关闭“param”捕获组并匹配该组任意次数(
)*
),最后匹配一个右括号、任意字符(惰性)和行尾(
\\).*$

在大括号一中,从params组内部删除ungreedy
。这将使括号立即大括号很难匹配,并且不会遗漏任何内容。(尽管如此)方法声明,特别是具有多个参数的方法声明,可以而且通常会跨越多行。
(?:^|[\r\n])[\w\s]*(?<params>\(.*?\))
(?:^|[\r\n])[\w\s]*(?<params>\(.*?\)).*?\{