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

本文关键字:正则表达式 参数 提取 用于 | 更新日期: 2023-09-27 18:31:13

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

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

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

即 Param1, Param2, ParamWith"Quotes"

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

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

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

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

但是,仅出于

这个原因,使用''"引号获取参数会更加困难:正则表达式可以用来匹配嵌套模式吗?参见 L.B 的解决方案,但如前所述,正则表达式不是为了处理嵌套而发明的。

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

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

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

为了扩展我的最后一点,如果你有一个像这样的字符串"GetStatus(Param1, Param2, ParamsWith''"Quotes''")"我真的不知道该告诉你什么,特别是如果"引号"中有","。

假设您的参数仅包含字母,数字和空格

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();

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

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

  1. 通过查找第一个出现的"("。
  2. 忽略空格,直到到达"("之后的第一个字符
  3. 如果您有 ''" 读取参数,直到找到另一个 ''"。 不带前面的 '''' 表示参数的结束。如果第一个非空格不是 ''",则读取,直到找到空格(大概取决于哪些参数对您的字符串有效)。这是您的第一个参数。
  4. 跳过空格,直到到达","或")"。如果为",",则返回步骤 2。如果为")",则位于参数列表的末尾。