如何匹配逗号分隔的列表并以不同的字符结尾

时间:2018-08-18 02:01:09

标签: c# regex

我目前正在从事的一个项目涉及用C#编写解析器。

我选择使用Regex提取每一行的部分。只有一个问题...我对Regex的经验很少。

我当前的问题是我无法使用参数列表。更具体地说,我无法匹配以逗号分隔的列表。卡了两个小时之后,我转向了。

到目前为止,我最接近的正则表达式是:

(?:\s|^)(bool|int|string|float|void)\s+(\w+)\s*\(((?:bool|int|string|float)\s+\w+\s*)*\)

很明显,实际的代码部分不匹配。只需要列出的类型。

我删除了所有逗号检测代码,因为它们都坏了。

我要使其与void FunctionName(int a, string b)或与其他间距匹配的文本。


我如何做到这一点?

请在投票结束前建议修改,我对堆栈溢出很不好。

2 个答案:

答案 0 :(得分:1)

像这样尝试:

(?:\s|^)(bool|int|string|float|void)\s+(\w+)\s*\(((?:bool|int|string|float)\s+\w+(?(?=\s*,\s*\w)\s*,\s*|\s*))*\)

Demo

说明:

  • 这里的关键部分是if-else regex a la (?(?=regex)then|else)(?(?=\s*,\s*\w)\s*,\s*|\s*)
    这意味着:如果一个类型参数对后跟一个逗号断言,则会出现另一个单词字符。

但是,如果觉得使用正则表达式可能会成为您手头任务的错误选择。有一些轻量级的解析器框架,例如Sprache

答案 1 :(得分:0)

您实际上非常亲密:

(?:\s|^)(bool|int|string|float|void)\s+(\w+)\s*\(((?:bool|int|string|float)\s+\w+,?\s*)*\)

唯一的区别是,?接近正则表达式的末尾,这意味着一个可选的逗号并将与变量之间的逗号匹配。