我正在尝试从像字符串这样的函数调用中提取参数,例如:
GetStatus("Param1", "Param2", "ParamWith\"Quotations\"")
我对正则表达式没用,但是是否可以通过这种方式匹配这些参数值,包括转义的引号?
即Param1,Param2,ParamWith“报价”
更好的是,有没有办法提取函数名,如果括号和参数存在,只有参数?
如果这有所作为,我正在使用 C#。
您可以在 ( 上拆分和修剪以获取函数名称。
但是,仅因为这个原因,使用 \" 引号获取参数会有点困难:Can regular expressions are used to match nested patterns?。参见 LB 的解决方案,但正如所说,正则表达式并不是为了处理嵌套而发明的。
您问如果参数周围没有引号,是否可以从字符串中获取函数名称和所有参数。考虑到您可以避免嵌套引号,我会说这更合理。我确信有很多关于如何解析类 Unix 命令的参考资料(即命令 -options 参数“带引号的参数”),但我会使用正则表达式来解决这个问题:
Regex reg = new Regex("\".*?\"")
这将为您提供所有带有引号的参数。然后从原始字符串中删除所有匹配项,并在 ',' 上拆分剩余参数。这就是我的想法,但如果你研究它可能会有更简单的方法。
为了扩展我的最后一点,如果你有一个像这样的字符串 "GetStatus(Param1, Param2, ParamsWith\"Quotations\")" 我真的不知道该告诉你什么,特别是如果有 ',' 在 \ “报价单”。
您可以在“(”上执行 String.split 以获取方法名称,然后在“,”上进行拆分以拆分参数
编辑:代替使用正则表达式的更好解决方案,您始终可以自己进行解析。假设一个格式正确的字符串:
假设你的参数只包含字母、数字和空格
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();