3

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

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

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

即Param1,Param2,ParamWith“报价”

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

如果这有所作为,我正在使用 C#。

4

3 回答 3

1

您可以在 ( 上拆分和修剪以获取函数名称。

但是,仅因为这个原因,使用 \" 引号获取参数会有点困难:Can regular expressions are used to match nested patterns?。参见 LB 的解决方案,但正如所说,正则表达式并不是为了处理嵌套而发明的。

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

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

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

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

于 2012-04-13T16:54:22.023 回答
0

您可以在“(”上执行 String.split 以获取方法名称,然后在“,”上进行拆分以拆分参数

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

  1. 通过查找第一次出现的 '(' 从参数列表中拆分名称。
  2. 忽略空格,直到到达 '(' 之后的第一个字符
  3. 如果你有一个 \" 读取​​参数,直到你找到另一个 \"。\" 没有前面的 \\ 表示参数的结尾。如果第一个非空格不是 \" 则读取直到找到空格(大概取决于哪些参数对您的字符串有效)。这是你的第一个参数。
  4. 跳过空格,直到到达 ',' 或 ')'。如果是 ',' 则返回到第 2 步。如果是 ')' 你在参数列表的末尾。
于 2012-04-13T16:03:32.623 回答
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();
于 2012-04-13T16:40:56.380 回答