用于提取参数的正则表达式

时间:2012-04-13 15:44:17

标签: c# regex

我正在尝试从像字符串这样的函数调用中提取参数,例如:

GetStatus("Param1", "Param2", "ParamWith\"Quotations\"")

我对正则表达式没用,但是可以用这种方式匹配这些参数值,包括转义引用吗?

即。 Param1,Param2,ParamWith“Quotations”

更好的是,有没有办法提取函数名称,只有括号和参数存在的参数?

我正在使用C#,如果这有所不同。

3 个答案:

答案 0 :(得分:1)

您可以拆分和修剪(获取功能名称。

然而,单独使用“引用”来获取参数会更加困难:Can regular expressions be used to match nested patterns?。请参阅LB的解决方案,但正如所说,正则表达式不是为了处理嵌套而发明的。

如果参数周围没有引号,您询问是否可以从字符串中获取函数名称和所有参数。我想说这可以避免嵌套的引号,这样更合理。我确信有很多关于如何解析类Unix命令的引用(即命令-options参数“带引号的参数”),但我会使用正则表达式来解决这个问题:

Regex reg = new Regex("\".*?\"")

这将为您提供所有带引号的参数。然后从原始字符串中删除所有匹配项,并在其余参数的“,”上拆分。这就是我如何思考它,但如果你研究它可能会有一个更简单的方法。

要扩展我的最后一点,如果你有一个像这样的字符串“GetStatus(Param1,Param2,ParamsWith \”Quotations \“)”我真的不知道该告诉你什么,特别是如果有','在“引文”中。

答案 1 :(得分:0)

你可以在'('获取方法名称然后拆分','来拆分参数

上的String.split

编辑: 使用正则表达式代替更好的解决方案,您可以自己进行解析。假设一个正确形成的字符串:

  1. 通过查找第一次出现的'('。
  2. ,从参数列表中拆分名称
  3. 忽略空格,直到你到达'('
  4. 之后的第一个字符
  5. 如果您有“读取参数,直到找到另一个”。 \“没有前面的\\表示参数的结尾。如果第一个非空格不是”读取,直到找到空格(大概取决于哪些参数对你的字符串有效)。那是你的第一个参数。
  6. 跳过空格直到找到','或')'。如果','则返回步骤2.如果')'您在参数列表的末尾。

答案 2 :(得分:0)

假设你的参数只包含字母,数字和空格

string fxn = @"GetStatus(""Param1"", ""Param2"", ""ParamWith\""Quotations\"""")";

var result = Regex.Matches(fxn, @"\""(?<GRP>[\w \\\""]+)\""|(?<GRP>\w+[ ]*)")
    .Cast<Match>()
    .Select(m => m.Groups["GRP"].Value)
    .ToArray();