我目前正在从事的一个项目涉及用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)
或与其他间距匹配的文本。
我如何做到这一点?
请在投票结束前建议修改,我对堆栈溢出很不好。
答案 0 :(得分:1)
像这样尝试:
(?:\s|^)(bool|int|string|float|void)\s+(\w+)\s*\(((?:bool|int|string|float)\s+\w+(?(?=\s*,\s*\w)\s*,\s*|\s*))*\)
说明:
(?(?=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*)*\)
唯一的区别是,?
接近正则表达式的末尾,这意味着一个可选的逗号并将与变量之间的逗号匹配。